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

496 阅读2分钟

704. 二分查找

image.png

思考

二分查找之前学过的,做起来相对容易一些。第一次接触二分查找,有些细节确实感到很困惑。像是循环的跳出条件这些,还有开闭区间问题,都有一些难理解。当时是结合一些具体的例子去一点点理解的,按照代码一步去走,走下来之后就会有一些体会了,最终产生理解的感觉。

现在基本上是把这个代码给记住了,没有刻意去分析其中的逻辑,有点顺其自然了,不知道这样是好还是不好。

代码

int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        // int mid = left + (right - left) / 2; 优化1:代码简洁性
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(target == nums[mid]){
                return mid;
            }
            else if(target > nums[mid]){
                // left = mid; 错误1:导致超出时间限制,此种写法,中间元素不用再判断
                left = mid + 1;
                // mid = left + (right - left) / 2;优化1:代码简洁性
            }
            else{
                // right = mid; 错误1
                right  = mid - 1;
                // 优化1:mid = left + (right - left) / 2;优化1:代码简洁性
            }
        }
        return -1;
    }

27. 移除元素

image.png

示例 1:

输入: nums = [3,2,2,3], val = 3
输出: 2, nums = [2,2]
解释: 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入: nums = [0,1,2,2,3,0,4,2], val = 2
输出: 5, nums = [0,1,4,0,3]
解释: 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

思考:

这一题使用双指针法会方便一些,最早接触这一思想是在数据结构的学习时。记得荷兰国旗问题就是用这个思想来解的,具体有点记不清楚了。

代码

int removeElement(vector<int>& nums, int val) {
        int size = nums.size();
        int index1 = 0;
        int index2 = nums.size() - 1;
        while(index1 <= index2){
            if(nums[index1] == val){
                nums[index1] = nums[index2];
                index2--;
                size--;           
            }
            else{
                index1++;//不相等则index指针后移一位
            }
        }
        return size;
    }