LeetCode | 17.04.消失的数字和189.旋转数组

简介: 17.04.消失的数字OJ链接这里题目要求在时间复杂度上O(n)我们介绍三种方法,看看哪种方法适合这道题~~

17.04.消失的数字

OJ链接

  • 这里题目要求在时间复杂度上O(n)我们介绍三种方法,看看哪种方法适合这道题~~

方法一:

  1. 先冒泡排序
  2. 遍历,当前值+1,不等于下一个数

这个时间复杂度O(N^2)

方法二:

  1. 将数组的每个元素异或0
  2. 遍历,再将异或出来的结果每个再异或

这个时间复杂度是O(N)

方法三:

  1. 0到n等差数列公式计算和((首项 + 尾项) * 项数)/2
  2. 依次减掉数据中的值,剩下的就是消失的数字

这个时间复杂度是O(N)

  • 可见只有方法二和方法三符合题目要求,下面我们就写一下这个代码

方法二的代码

int missingNumber(int* nums, int numsSize){
    int N = numsSize;
    int sum = ((0+N)*(N+1))/2;
    for(int i= 0;i<numsSize;i++){
        sum-=nums[i];
    }
    return sum;
}

方法三的代码

int missingNumber(int* nums, int numsSize){
    int x = 0;
    for(int i = 0;i<numsSize;i++){
        x^=nums[i];
    }
    for(int i = 0;i<=numsSize;i++){
        x^=i;
    }
    return x;
}

189.旋转数组

OJ链接

  • 我们这个题肯有些同学在C语言的时候做过

思路一

我们先来看思路一:

  • 思路一的时间复杂度是多少?
  • 可能有的同学算出来的是O(N*K),不完全正确~~
  • 最好的情况:k % N = 0,k = 7,旋转0次!!!是O(1)。k是N的倍数时,不需要旋转~~
  • 最坏的情况:k % N = N - 1时,比如13次旋转的最多,20次最多…
  • 所以这个题的真正复杂度是O(N*(N-1))—>O(N^2)

那么我们要求时间复杂度是O(N),那么我们怎么优化呢?

思路二

我们这里就要看思路二:

  • 这里很明显是O(N)

代码如下:

void reverse(int* nums,int left,int right){
    while(left<right){
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
        left++;
        right--;
    }
}
void rotate(int* nums, int numsSize, int k){
    if(k>numsSize){
        k %=numsSize;
    }
    reverse(nums,0,numsSize-1);
    reverse(nums,0,k-1);
    reverse(nums,k,numsSize-1);
}
  • 注意这里k一定要%numsSize,否则会报错~~

思路三

空间换时间

  • 这里的时间复杂是O(N),空间复杂度是O(N)

代码如下:

void rotate(int* nums, int numsSize, int k) {
  k %= numsSize;
  int tmp[numsSize];
  int j = k;
  //拷贝前n-k个
  for (int i = 0; i < numsSize - k; i++) {
    tmp[j++] = nums[i];
  }
  //拷贝后k个
  j = 0;
  for (int i = numsSize - k; i < numsSize; i++) {
    tmp[j++] = nums[i];
  }
  //拷贝回原数组
  for (int i = 0; i < numsSize; i++) {
    nums[i] = tmp[i];
  }
}
相关文章
|
7天前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
6 0
|
7天前
|
存储 算法 索引
力扣每日一题 6/24 模拟 数组 单调栈
力扣每日一题 6/24 模拟 数组 单调栈
7 0
|
7天前
力扣随机一题 哈希表 排序 数组
力扣随机一题 哈希表 排序 数组
8 1
|
7天前
|
存储 算法
力扣每日一题 6/20 数学+数组
力扣每日一题 6/20 数学+数组
5 1
|
7天前
|
缓存
力扣每日一题 6/14 动态规划+数组
力扣每日一题 6/14 动态规划+数组
8 1
|
21天前
|
C++ Python
二刷力扣--数组
二刷力扣--数组
|
22天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
22天前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
3天前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
5 0
|
25天前
|
存储 算法 数据可视化
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)