704.二分查找
代码随想录链接:代码随想录 (programmercarl.com)
要点:数组有序且无重复元素
1. 左闭右闭:区间左右边界都有意义
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右闭
int left=0;
int right=nums.size()-1;
while(left<=right){
int mid=left+((right-left)/2);
if(nums[mid]<target){
left=mid+1;
}
else if(nums[mid]>target){
right=mid-1;
}
else{
return mid;
}
}
return -1;
}
};
2. 左闭右开:右边界无意义。需要注意right的赋值
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右开
int left=0;
int right=nums.size();
while(left<right){
int mid = left+((right-left)/2);
if(nums[mid]>target){
right=mid;
}
else if(nums[mid]<target){
left=mid+1;
}
else{
return mid;
}
}
return -1;
}
};
27.移除元素
1. 暴力
需要更新数组的大小;删掉元素后下标i需要向前一个,因为后面的数组都向前移了(代码随想录链接)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//暴力
int count=nums.size();
for(int i=0;i<count;i++){
if(nums[i]==val){
for(int j=i;j<count-1;j++){
nums[j]=nums[j+1];
}
i-=1;// 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
count-=1;
}
}
return count;
}
};
2. 双指针
快慢指针来做交换。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//快慢指针
int slow=0;
int fast=0;
while(fast<nums.size()){
if(nums[fast]==val){
fast+=1;
}
else{
nums[slow]=nums[fast];
slow++;
fast++;
}
}
return slow;
}
};
977.有序数组的平方
做完27就一直想两个同方向的指针比大小交换(后来想想这样好像就是暴力排序了),但是数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。(代码随想录链接)头尾指针比较。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int h=0;
int t=nums.size()-1;
int k=nums.size()-1;
vector<int> result(nums.size(),0);
while(h<=t){
if(nums[h]*nums[h]<=nums[t]*nums[t]){
result[k]=nums[t]*nums[t];
t--;
}
else{
result[k]=nums[h]*nums[h];
h++;
}
k--;
}
return result;
}
};
总结
复习了二分查找。移除元素的快慢指针写的时候逻辑出错了,debug用了一些时间。有序数组的平方没有想到头尾指针。
时间复杂度的计算对我来说一直是难题,上课的时候没学好真是后悔啊。后面一边做题一边训练,希望能好一点。
今天做题时间上用了快2个小时,中间总是玩手机或者看别的去了。希望通过这次训练营可以提升一些专注力。