大家好,这里是小编的博客频道
小编的博客:就爱学编程
很高兴在CSDN
这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!
目录
废话不多说,我们直接看题。
1.轮转数组
(1)题目描述
(2)解题思路
结论:逆置左边,逆置右边,整体逆置就可达到向右轮转的目的。
代码实现:
c
void Reserve(int* a, int left, int right){
while(left < right){
int tmp = a[left];
a[left++] = a[right];
a[right--] = tmp;
}
}
void rotate(int* nums, int numsSize, int k) {
if(numsSize == 1) return;
k %= numsSize;
Reserve(nums, 0, numsSize - k - 1);
Reserve(nums, numsSize - k, numsSize - 1);
Reserve(nums, 0, numsSize - 1);}
- 那如果是向左轮转呢?
也很简单,向左轮转k步等于向右轮转(
numsSize - (k %= numsSize))
)步
代码就变为:
c
void Reserve(int* a, int left, int right){
while(left < right){
int tmp = a[left];
a[left++] = a[right];
a[right--] = tmp;
}
}
void rotate(int* nums, int numsSize, int k) {
if(numsSize == 1) return;
k = (numsSize - (k %= numsSize)));
Reserve(nums, 0, numsSize - k - 1);
Reserve(nums, numsSize - k, numsSize - 1);
Reserve(nums, 0, numsSize - 1);}
2.合并两个有序数组
(1)题目描述
(2)解题思路
双指针 + 从后往前
代码实现:
c
void merge(int* nums1, int numsSize1, int m, int* nums2, int numsSize2, int n) {
//想要空间复杂度为常数,只有从后向前依次比较(无论是要升序还是降序)
int begin1 = m - 1, begin2 = n - 1;
int tail = m + n - 1;
while (begin1 >= 0 && begin2 >= 0) {
if (nums1[begin1] > nums2[begin2]) {
nums1[tail--] = nums1[begin1--];
} else {
nums1[tail--] = nums2[begin2--];
}
}
while (begin2 >= 0) {
nums1[tail--] = nums2[begin2--];
}
}