704 二分查找
这道题看到原数组是“有序”,就想着用二分法去做,时间复杂度为(logn)。做完一遍之后,不明白“左闭右开”的写法是什么意思,然后就去代码随想录那里去温习。个人总结一下“左闭右开”就是:取不到right指针。也就是说right初始化是数组边界下标+1;如果是更新right也是直接让它赋值为mid就好了(因为mid取不到)。表现为代码就是这样
int search(vector<int>& nums, int target) {
int left = 0;int right = nums.size();int mid;
while(left<right){
mid = (left+right)/2;
if(nums[mid]<target){
left = mid + 1;
}
else if(nums[mid]>target){
right = mid;
}
else{
return mid;
}
}
return -1;
}
整体而言比“左闭右闭”的代码更好看一点。
35.搜索插入位置
跟704区别不大,就是多了个插入位置的判断:
//判断插入到哪里
if(nums[mid]>target){
return mid;
}
else{
//大的元素往后插一个位置
return mid+1;
}
27. 移除元素
数组规模在100以内,可以用暴力方法O(
),但题干说
“k个元素以外留下什么并不重要”,那么我们就可以用双指针去处理。其中快指针是遍历原数组,慢指针是新数组的下标,两者都是从0开始找到合适的元素就赋值给慢指针并且更新慢指针即可。复杂度为O(n)。
977.有序数组的平方
题目链接:977. 有序数组的平方 - 力扣(LeetCode)
因为数组规模为其实这道题也可以用最直观的“先平方,再排序”来做,最不济的冒泡排序复杂度也就是O(
),规模小于
,也能过。但因为平方后的数组(如果有负数元素)变化的趋势是左右两端为大,中间逐渐小。两端我们就可以用两个指针,像归并排序一样,比较平方后的大小,并将大的元素赋值结果数组中。又因为我们是从大到小赋值,所以结果数组下标k也要从末端开始更新。复杂度为O(
)
代码和示意图如下图所示。


被折叠的 条评论
为什么被折叠?



