代码随想录算法训练营Day01|704. 二分查找、27. 移除元素

代码随想录算法训练营Day01|704. 二分查找、27. 移除元素

704. 二分查找

题目链接:704.二分查找

首先注意题干的描述:

  • 题干描述说明了元素是升序排列的,否则需要调用sort进行手动排序
  • 另外提示中说明元素不重复,因此不空考虑二分查找多解的情况。

说回题目本身,重点在于二分查找边界和遍历时终止的条件之间的匹配。

简单总结来说就是“左闭右开不相等,左闭右闭要相等。”


题解如下:

①左闭右开

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int len = nums.size();
        // cout << len << endl;
        int left = 0, right =len, 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;
    }
};

②左闭右闭

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int mid, len = nums.size();
        int left = 0, right = len - 1;
        while (left <= right) {
            mid = (left + right) / 2;
            if (nums[mid] < target) 
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid - 1;
            else
                return mid;
        }
        return -1;
    }
};

27. 移除元素

题目链接:27.移除元素

题干要求空间复杂度为O(1),这意味着我们必须再原数组上进行删减和修改,不能再开辟新的存储空间。

思路是利用快慢指针的方法:

  • 快指针:负责遍历原数组,寻找与target不相等的数据元素。

  • 慢指针:负责对原数组进行原地修改,将快指针找到的不等元素重新赋值给数组。

    因为慢指针始终慢于/齐平于快指针,所以慢指针修改的下标位置必定已经被快指针筛选过。


代码如下:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        // 快慢指针原地修改数组
        int fast = 0, slow = 0;
        while (fast < nums.size()) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
};
posted @ 2022-11-16 20:58  脱线森林`  阅读(458)  评论(0编辑  收藏  举报