面试经典150题
数组/字符串
合并两个有序数组
最直接的方法是先合并再排序,考虑做线性复杂度优化。如果每次放一个元素到正确位置就把其他元素往后挪,肯定不是线性时间复杂度,那就从后往前看,把两个数组中较大的元素填入,遍历用双指针实现。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = n + m - 1;
int j = m - 1;
int k = n - 1;
while(k >= 0 && j >= 0){
if(nums2[k] >= nums1[j]){
nums1[i] = nums2[k];
k--;
}
else{
nums1[i] = nums1[j];
j--;
}
i--;
}
if(j <= 0){
for(int a = 0; a <= k; a++){
nums1[a] = nums2[a];
}
}
}
};
移除元素
使用左右指针,把右边不等于val的元素挪到左边等于val的地方,直到左右指针相遇。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = nums.size();
for(int i = 0; i < k; i++){
if(nums[i] == val){
while(nums[k - 1] == val && k > i + 1){
k--;
}
k--;
nums[i] = nums[k];
}
}
return k;
}
};