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

256 阅读1分钟

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

704. 二分查找

题目链接:704. 二分查找

  • 第二次刷一气呵成
  • 能够熟练地掌握开区间和闭区间了
  • 在nums[mid] > target的时候,说明目标值应该在左半区域,所以收窄右侧边界
  • 同理,小于的时候收窄左侧边界
  • 大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。
  • 空间复杂度:O(1)
  • 时间复杂度:O(logn)

27. 移除元素

题目链接:27. 移除元素

  1. 暴力法,不管空间复杂度,可以创建一个新的数组跳过需要移除的元素

  2. 双指针法

    • 快指针获取数组中新值
    • 慢指针获取数组中需要更新的位置
  3. 相向指针法

     class Solution {
     public:
         int removeElement(vector<int>& nums, int val) {
             int len = nums.size();
             int left = 0; 
             int right = nums.size() - 1;
             while(left <= right) {
                 if(nums[left] == val){
                     int temp = nums[right];
                     nums[right] = nums[left];
                     nums[left] = temp;
                     left--;
                     right--;
                 }
                 left++;
             }
             return left;
         }
     };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)