题一:删除有序数组中的重复项
给你一个 升序排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
思路一:
暴力求解,直接定义一个int类型取不到的数,让这个数去判断与其他的数是否相同,相同不理会,不相同赋值到【left】位置,left就是就是要输出的长度。
int removeDuplicates(int* nums, int numsSize)
{long num = 80000000000;int left = 0;for(int i = 0;i < numsSize; i++){if(nums[i] != num){num = nums[i];nums[left++] = num;}}return left;
}
思路二:
1. 设置一个计数,记录从前往后遍历时遇到的不同元素的个数不同的元素需要往前搬移;
2. 遍历数组,如果nums[i]与nums[count]不等,就将nums[i]搬移到nums[++count]位置,不同元素多了一个;
3. 循环结束后将count++(将【0】加上),返回count。
即nums[0]处不动,nums[0]与nums[1]处比较,不同就将nums[1]的值放入,然后i++,然后与nums【1】比较,循环这个操作一直判断到结束。
int removeDuplicates(int* nums, int numsSize){int count = 0;for(int i = 1; i < numsSize; ++i){if(nums[count] != nums[i] )nums[++count] = nums[i];}++count;return count;
}
题二:合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
特别关注:
递增:1 2 3 4 5
非递减:1 2 2 3 3 4(不是递减,递增但是有相同的元素)!
思路一:
第一步:从后往前遍历数组,将nums1和nums2中的元素逐个比较将较大的元素往nums1末尾进行搬移; 第二步:第一步结束后,nums2中可能会有数据没有搬移完,将nums2中剩余的元素逐个搬移到nums1。 时间复杂度:O(m+n) 空间复杂度: O(1)
oid merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int sz = nums1Size;while(m > 0 && n > 0){if(nums1[m-1] > nums2[n-1]){nums1[sz-1] = nums1[m-1]; m--;sz--;}else{nums1[sz-1] = nums2[n-1];n--;sz--;}}if(m == 0){while(n > 0){nums1[sz-1] = nums2[n-1];n--;sz--;}}}