LeetCode 704 二分查找
链接:https://leetcode.cn/problems/binary-search/

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

心得:

  1. 要考虑好区间是闭合还是开放的,如果是左闭右闭,那么循环条件就是小于等于号(因为这时候left和right都是在考虑范围内的!!!),如果是左闭右开,那么就是小于号(这时right不予考虑)。

  2. 注意,在求中值mid时,最好采用left + (right-left)/2 的写法,如果是(right + left)/2,可能会导致溢出。

LeetCode 27.移除元素
链接:https://leetcode.cn/problems/remove-element/submissions/

点击查看代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left = 0;
        for(int right = 0; right < nums.size(); right++){
            if(val != nums[right]){
                nums[left++] = nums[right];
            }
        }
        return left;
    }
};

心得:

  1. 一开始想到暴力破解是不太巧妙的办法,于是想到了设置两个指针,可是在设计两个指针如何移动的时候出现了问题,我是将快指针设置成了从1开始,并且在用slow从0开始循环进行遍历,中间的判断条件是if(nums[slow] == val),这样写下去,完全就乱套了。后来发现我是没有定义好快慢指针各自的角色,造成混淆了,慢指针的角色就是记录下一个不是val的值的位置,而快指针就是负责遍历整个数组,并且把不是val的角色告诉慢指针,这样想代码就好写多了。以后写代码要思考清楚再动手。
posted on 2023-03-01 21:08  小黑哈哈  阅读(160)  评论(0编辑  收藏  举报