立志重刷代码随想录60天冲冲冲!!——第一周查缺补漏

(周末补更)

34. 在排序数组中查找元素的第一个和最后一个位置

第一个target:简单二分,然后target == nums[mid]时,再次添加right = mid - 1

最后一个target:还是简单二分,然后target == nums[mid]时,再次添加left = mid + 1

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int len = nums.size();
        int first = -1, last = -1;

        // 寻找第一个target
        int left = 0;
        int right = len - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (target < nums[mid]) {
                right = mid - 1;
            } else if (target > nums[mid]){
                left = mid + 1;
            } else {
                // 若target == nums[mid],right = mid - 1;
                right = mid - 1;
                first = mid;
            }
        }

        // 寻找第一个target
        left = 0;
        right = len - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (target < nums[mid]) {
                right = mid - 1;
            } else if (target > nums[mid]){
                left = mid + 1;
            } else {
                // 若target == nums[mid],left = mid + 1;
                left = mid + 1;
                last = mid;
            }
        }

        return {first, last};
    }
};

(拓展练习)

69. x 的平方根 

class Solution {
public:
    int mySqrt(int x) {
        int left = 0;
        int right = x;
        int ans = -1; // 记录答案

        while (left <= right) {
            int mid = (left + right) / 2;
            // 有可能内存泄漏,需定义long long
            if ((long long)mid * mid > x) {
                right = mid - 1;
            } else {
                ans = mid;
                left = mid + 1;
            }
        }
        return ans;
    }
};

367. 有效的完全平方数

若right = num; 可以省略num == 1的情况;

class Solution {
public:
    bool isPerfectSquare(int num) {
        if (num == 1) {return true;} // 若right = num; 可以省略此行;

        int left = 0, right = num - 1;

        while (left <= right) {
            int mid = (left + right) / 2;
            if ((long long)mid * mid < num) {
                left = mid + 1;
            } else if ((long long)mid * mid > num) {
                right = mid - 1;
            } else {
                return true;
            }
        }
        return false;
    }
};

26. 删除有序数组中的重复项

相当不熟练,要想清楚快慢指针含义,分别处理快慢指针进位。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        if (len == 1) {return len;}

        int slow = 1, fast = 1;
        while (fast < len) {
            // 慢指针表示位置,快指针表示数值(无论如何都要向前走)
            // 快指针与前一格不同,就把快指针赋值给慢指针,慢指针++
            if (nums[fast] != nums[fast - 1]) {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
};

283. 移动零

有了上一题双指针思路,这个秒

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int len = nums.size();
        int slow = 0, fast = 0;

        // 慢指针是位置,快指针是数值(快指针需不停向前)
        // 快指针指向0,快慢指针交换,慢指针++
        while (fast < len) {
            if (nums[fast] != 0) {
                swap(nums[slow], nums[fast]);;
                slow++;
            }
            fast++;
        }
    }
};

代码随想录更新 文章被收录于专栏

冲冲冲冲冲冲!

全部评论

相关推荐

点赞 评论 收藏
分享
05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务