代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素,977.有序数组的平方
704.二分查找
对于有序元素的查找,二分搜索简单高效。
二分查找写很多遍了,三个指针:left right mid,重点在于范围的开闭情况。
我之前“背”的一直都是左闭右闭的情况
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
int mid;
while(left<=right){
mid=(left+right)/2;
if(nums[mid]==target) return mid;
if(nums[mid]>target){
right=mid-1;
}else{
left=mid+1;
}
}
return -1;
}
};
如果要是左闭右开 [left,right),则
while(left<right)
right=mid
left=mid+1
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
27.移除元素
自己先写了一下:思路是头尾两个指针遍历数组,如果头指针碰到要移除的元素则跟尾部指针所指的元素交换;如果尾指针指向的直接就是要移除元素,则它前移,计数加一。这个思路理论上是没问题的,但我写的时候没有处理好边界情况,例如只有一个元素并且它刚好要移除,所以通过不了。
学习双指针的思路写正确代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
for(int fast=0;fast<nums.size();fast++){
if(nums[fast]!=val){
nums[slow++]=nums[fast];
}
}
return slow;
}
};
nums[slow++]=nums[fast];
和
nums[slow]=nums[fast];
slow++;
一样 之后都这样写显得简洁一点。
977.有序数组的平方
我的想法:
非负数平方前后的相对位置是不会变的,重点就是要把原来的负数平方后插入到正数当中去?卡住了
噢,看到函数返回值是数组,不是原地排序,那就简单了,双指针
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left=0,right=nums.size()-1;
vector<int> res(nums.size());
int index=nums.size()-1;
while(left<=right){
int sql=nums[left]*nums[left];
int sqr=nums[right]*nums[right];
if(sql>sqr){
res[index--]=sql;
left++;
}else{
res[index--]=sqr;
right--;
}
}
return res;
}
};
while(left<=right)这里一开始写成了while(left<right),这样会导致有一个元素没有处理,res少了一个元素。
浙公网安备 33010602011771号