少年听雨歌楼上,红烛昏罗帐。
壮年听雨客舟中,
江阔云低、断雁叫西风
而今听雨僧庐下鬓已星星也。
悲欢离合总无情,
一任阶前、点滴到天明。
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109
定位是简单题,由于题目给的nums1的长度是m+n,因此我们可以直接从nums1的尾部放入较大的元素,这样就可以不用额外创建数组来存,即双指针的思想。[复习一下归并排序]
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m - 1, j = n - 1, cur = m + n - 1;
while(i >= 0 && j >= 0){
if(nums1[i]>= nums2[j]) nums1[cur --] = nums1[i --];
else nums1[cur --] = nums2[j --];
}
while(i >= 0) nums1[cur --] = nums1[i --];
while(j >= 0) nums1[cur --] = nums2[j --];
}
};
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
题目要求要原地操作,也是双指针,i为等于val的位置,即需要被后续不等于val的值覆盖,j为每次循环判断的位置。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i = 0, j = 0;
for(int num : nums){
if(num == val) j ++;
else nums[i ++] = nums[j ++];
}
return i;
}
};
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k 。
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按 非严格递增 排列
题目的意思是返回不重复元素的个数k,但是还要满足nums数组的前k个数正好就是不重复的k个数。其实也是双指针的思想(这是捅了双指针的窝吗)。i表示当前重复的元素位置,需要被后面不重复的元素覆盖,如果此时的元素没有重复,直接令nums[i] = nums[j], i ++
;否则说明当前i不能被j位置的元素替代,因此重复了,因此i不变,继续循环j,直到找到不重复的元素替代。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if(n < 2) return n;
int i = 1;
for(int j = 1;j < n;j ++ ){
if(nums[j] != nums[i - 1]) nums[i ++] = nums[j];
}
return i;
}
};
### 80. 删除有序数组中的重复项 II
和上面那题基本一样,不过这题要求重复的元素只出现两次...同样的,我们判断的时候只需要判断位置i的前两个元素和待插入的位置j的元素是否相等即可。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if(n < 3) return n;
int i = 2;
for(int j = 2;j < n; j ++ ){
if(nums[j] != nums[i - 2]) nums[i ++] = nums[j];
}
return i;
}
};
总结,简单题,但是思路挺多的,尽量还是不要用暴力,挺无脑的。