这篇内容来分析分析两个oj题。
力扣链接:消失的数字
数组
包含从
到
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在
时间内完成吗? 注意:本题相对书上原题稍作改动 示例 1: 输入:
输出:
示例 2: 输入:
输出:
int missingNumber(int* nums, int numsSize){
}
已知数组中
只缺了一个数,先计算出数组不缺这一个数时的所有数的和
;
遍历数组
,计算数组实际所有数的和
;
二者的差值
就是所缺的那个数。
时间复杂度
空间复杂度
int missingNumber(int* nums, int numsSize){
int sum1 = (numsSize*numsSize+numsSize)/2;
int sum2 = 0;
for(int i=0; i<numsSize; ++i){
sum2 += nums[i];
}
return sum1 - sum2;
}
力扣链接:轮转数组
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入:
,
输出:
解释: 向右轮转 1 步:
向右轮转 2 步:
向右轮转 3 步:
提示:
进阶: 尽可能想出更多的解决方案,至少有三种 不同的方法可以解决这个问题。 你可以使用空间复杂度为
的 原地 算法解决这个问题吗?
void rotate(int* nums, int numsSize, int k){
}
右旋数组
个元素,首先想最简单的:右旋
个元素,把数组最后一个元素用临时变量保存起来;
其余前
个元素从后往前依次向后移动一个位置;
再把用临时变量保存起来的元素放入数组第一个位置;
重复上述操作
次即可。
时间复杂度
,当
足够大时也最多只能有效右旋
个元素,时间复杂度是
空间复杂度
以空间换时间的思想,临时创建一个与数组
大小相同的数组;
原数组需要右旋的后
个元素,相对顺序不变的放入临时数组的前
个位置;原数组前
个元素相对顺序不变的放入新临时数组的后
个位置;
把临时数组的所有元素依次移动到元数组对应位置即可。
时间复杂度
空间复杂度
这种思路比较难想,但确实非常好用。
首先,逆置数组的前
个不需要右旋的的元素;
然后,逆置数组后
个需要右旋的元素;
最后,逆置整个数组的元素。
时间复杂度
空间复杂度
//思路1
k %= numsSize;
while(k--){
int tmp = nums[numsSize-1];
for(int i=numsSize-1; i>0; --i){
nums[i] =nums[i-1];
}
nums[0] = tmp;
}
void rotate(int* nums, int numsSize, int k){
//思路2:空间换时间
k %= numsSize;
int *arr = (int*)malloc(sizeof(int) * numsSize);
int i=0;
for(int j=numsSize-k; j<numsSize; ++j,++i){
arr[i] = nums[j];
}
for(int j=0; j<numsSize-k; ++j,++i){
arr[i] = nums[j];
}
for(i=0; i<numsSize; ++i){
nums[i] =arr[i];
}
free(arr);
arr = NULL;
}
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){
//思路3:原地交换
k %= numsSize;
reverse(nums, 0, numsSize-k-1);
reverse(nums, numsSize-k, numsSize-1);
reverse(nums, 0, numsSize-1);
}
本文到这里就算是结束了,感谢看到这里的你!