当前位置:首页 > 编程笔记 > 正文
已解决

NO.1 | 704. 二分查找,27. 移除元素

来自网友在路上 166866提问 提问时间:2023-10-25 22:42:52阅读次数: 66

最佳答案 问答题库668位专家为你答疑解惑

NO.1 | 704. 二分查找,27. 移除元素

题目链接:704.二分查找

  • 前置条件:数组是有序的才可以,如果是乱序的数组则不可使用该题方法
  • 暴力解法:直接遍历,对每个元素都进行判断是否等于target,时间复杂度O(n)。但是这样就没有使用上数组有序的这个条件
  • 二分查找: 代码及注释如下
class Solution {
public:int search(vector<int>& nums, int target) {// 有序数组 --> 二分查找// left为数组的起始位置, right为数组的末尾位置int left = 0;int right =  nums.size()-1;int mid = 0;while(left <= right){   // 更新mid// 以下写法优于 mid = (left + right) / 2mid = left + (right - left) / 2;if(nums[mid] < target){// 由于数组是升序,此时说明target在当前所以mid的右边// left=mid相当于把mid左边的排除掉left = mid + 1;}else if(nums[mid] > target){   right = mid - 1;}else{// nums[mid] == targetreturn mid;}}// 如果nums中不存在target,则返回-1return -1;}
};

题目链接:27. 移除元素
解题思路:用覆盖代替删除,舍弃val的元素,然后被其他元素覆盖

class Solution {
public:int removeElement(vector<int>& nums, int val) {// 有效的元素int valid_pos = 0;// 遍历数组for(int i = 0; i < nums.size(); i++){// val != nums[i],说明 i 不需要被覆盖,就放到有效位上if(val != nums[i]){// 实现后面的元素前移,而且不用特意删除前面的元素,直接覆盖掉nums[valid_pos] = nums[i];valid_pos += 1;}else{// val == nums[i]// 不对 i 处理,如果要用到该位置,也会被覆盖掉}}return valid_pos;}
};

双指针思路讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html#%E6%80%9D%E8%B7%AF

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"NO.1 | 704. 二分查找,27. 移除元素":http://eshow365.cn/6-24504-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!