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

391 阅读1分钟
  • 今日学习链接

  • 数组是存放在连续内存空间上的相同类型数据的集合。

  • 力扣题目链接704

  • 27. 移除元素 - 力扣(LeetCode)

  • 题目初见思路

  • 704

    • 刷题的第一天入门题,几个月前虽然已经写过一次,但依然记得考虑边界条件花了很多时间。主要需要知道数组的底层实现原理。以及代码结构中的临界条件判定。如何进行中值的迭代。
  • 27

    • 遇到相等的就移到最后
  • 看过代码随想录之后的想法

  • 704

    • 防止溢出的习惯值得养成middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
  • 27

    • 快慢指针的方法需要掌握,感觉是之后会遇到的滑动窗口的退阶版。
  • 遇到的问题

  • 704

    • 两种不同的边界取值方式与迭代过程的关系,左闭右闭、左闭右开究竟有何意义。
  • 27

    • 自己第一次尝试出现了遗漏移除的结果。代码如下
    • 	  func removeElement(nums []int, val int) int {
      	      len := len(nums)
      	      for i:=0;i<len;i++ {
      	          if nums[i] == val {
      	              nums[i] = nums[len-1]
      	              len--
      	          }
      	      }
      	      return len
      	  }
      
    • 报错结果:

image.png 原因是没有考虑当末尾元素出现val时会被当前指针跳过,解决方案是出现目标值后,指针回退。

  • 解题代码及收获

  • 704

    • 左闭右闭
    • 	  func search(nums []int, target int) int {
      	      high := len(nums)-1
      	      low := 0
      	      for low <= high {
      	          mid := low + (high-low)/2
      	          if nums[mid] == target {
      	              return mid
      	          } else if nums[mid] > target {
      	              high = mid-1
      	          } else {
      	              low = mid+1
      	          }
      	      }
      	      return -1
      	  }
      
    • 左闭右开
    • 	  func search(nums []int, target int) int {
      	      high := len(nums)
      	      low := 0
      	      for low < high {
      	          mid := low + (high-low)/2
      	          if nums[mid] == target {
      	              return mid
      	          } else if nums[mid] > target {
      	              high = mid
      	          } else {
      	              low = mid+1
      	          }
      	      }
      	      return -1
      	  }
      
    • 通过对比两种方式,发现选用两边指针的临界条件决定了我们选用的区间是左闭右闭还是左闭右开。根据区间的选择,决定了我们为了该如何决定迭代后的指针与mid的关系。
  • 27

    • 向后替换方法

      • 		  //golang
        		  func removeElement(nums []int, val int) int {
        		      len := len(nums)
        		      for i:=0;i<len;i++ {
        		          if nums[i] == val {
        		              nums[i] = nums[len-1]
        		              len--
        		              i--
        		          }
        		      }
        		      return len
        		  }
        
    • 快慢指针法

      • 		  //C++
        		  // 时间复杂度:O(n)
        		  // 空间复杂度:O(1)
        		  class Solution {
        		  public:
        		      int removeElement(vector<int>& nums, int val) {
        		          int slowIndex = 0;
        		          for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
        		              if (val != nums[fastIndex]) {
        		                  nums[slowIndex++] = nums[fastIndex];
        		              }
        		          }
        		          return slowIndex;
        		      }
        		  };