【代码随想录】刷题笔记Day3

前言

时间过得好快,回宿舍昏昏沉沉睡个觉下午写个新闻稿就已经4点了,肚子不太饿,赶紧来刷题,开始之前先欣赏一下上次找左右边界的优秀题解,很简洁。

class Solution {
public:
    vector searchRange(vector& nums, int target) {
        return {searchLeftOrRightBound(nums, target, "left"), searchLeftOrRightBound(nums, target, "right")};
    }
private:
    int searchLeftOrRightBound(vector& nums, int target, const string& bound) {
        int left = 0, right = nums.size() - 1;  
        int res = -1;
        while (left <= right) {  // 左闭右闭
            int mid = (left + right) >> 1;  // 位运算,就是/2
            if (nums[mid] < target) {
                left = mid + 1;
            }
            else if (nums[mid] > target) {
                right = mid - 1;
            }
            else {
                res = mid;  // res就是我们要的边界索引
                if (bound == "left") {
                    right = mid - 1;  // 左边界就从相等处慢慢向左逼近
                }
                else if (bound == "right") {
                    left = mid + 1;  // 右边界就是从相等处慢慢向右逼近
                }
                else {
                    // 异常处理段
                }
            }
        }
        return res;
    }
};

69. x 的平方根 

  • 思路
    • 这道题理解和通过很简单,但是初期要注意一些细节处理
  • 我的代码(暴力解法)
    • class Solution {
      public:
          int mySqrt(int x) {
              int a = 0; 
              while(a * a < x){
                  a++;
              }
              if(a * a == x) return a;
              else return a-1;
          }
      };
    • 两个问题:0 <= x <= 231 - 1,int改为long,还有最后返回不够简洁,重写
    • class Solution {
      public:
          int mySqrt(int x) {
              long a = 0; 
              for(long i = 0; i * i <= x; i ++){
                  a = i;
              }
              return a; 
          }
      };
  • 二分法,寻找右边界
    • class Solution {
      public:
          int mySqrt(int x) {
              int l = 0, r = x, ans = -1;
              while(l <= r){
                  int m = l + (r - l) / 2; 
                  if((long long)m * m <= x){
                      l = m + 1;
                      ans = l;
                  }else{
                      r = m - 1;
                  }
              }
              return ans - 1;
          }
      };

 367. 有效的完全平方数

  • 有了前面的铺垫后很简单,直接用二分(一次AC的感觉太爽了,正反馈有了)
  • class Solution {
    public:
        bool isPerfectSquare(int num) {
            long long l = 0, r = num, ans = -1;
            while(l <= r){
                long long m = l + (r - l) / 2;
                if(m * m < num){
                    l = m + 1;
                }else if(m * m > num){
                    r = m - 1;
                }else{
                    return true;
                }
            }
            return false;
        }
    };

27. 移除元素

  • 思路
    • 遍历后,直接在原数组上进行修改,用a++把不是val的元素堆在最前面
    • 在《代码随想录》里这叫双指针法(快慢指针法):一个快指针和慢指针在一个for循环下完成两个for循环的工作。
  • 代码
    • class Solution {
      public:
          int removeElement(vector& nums, int val) {
              int len = nums.size();
              int a = 0;
              for(int i = 0; i <= len - 1; i ++){
                  if(nums[i] != val){
                      nums[a++] = nums[i];  // i为快指针,a为慢指针
                  }
              }
              return a;
          }
      };

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

  • 思路:双指针法,用一个数判断是否和快指针的数相同,慢指针用于修改数组
  • class Solution {
    public:
        int removeDuplicates(vector& nums) {
            int len = nums.size();
            int a = 0; // 慢指针
            int num = nums[a++]; // 先赋好初始值
            for(int i = 0; i <= len - 1; i ++){
                if(nums[i] != num){
                    num = nums[i];  //注意顺序
                    nums[a++] = num;
                }
            }
            return a;
        }
    };

 后言

有点饿了,吃饭去了,今天就开个移除元素的头,明天把剩下三道题刷了。晚上看点目标检测的网课就可以玩耍了,美滋滋。

你可能感兴趣的:(代码随想录刷题笔记,leetcode,算法,职场和发展)