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

文档讲解:代码随想录

视频讲解:无

状态:做出来了

文档笔记

1. 数组内存空间的地址是连续的,删除或添加元素的时候会使其他元素的地址变化。

2. C++中数组的地址是连续的且地址是以16进制保存的,而Java的数组内存地址不是连续的

第一题:二分法

我的写法:

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums)-1
        
        while left <= right:
            mid = (left + right) // 2
            if nums[mid] == target:
                return mid
            if nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1

        return -1

1. 左闭右闭

while left <= right # 因为 left == right 有意义

right = len(num) - 1

mid = right - 1

 2. 左闭右开

while left < right # left == right 没有意义

right = len(nums)

right = mid # 虽然包括mid,但并不会考虑mid

右是否开或闭,由 while left

第二题:移除元素

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        slow, fast = 0, 0

        while fast < len(nums):
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1

        return slow

快慢指针的思路

  • 慢指针:指向需要被替换的元素
  • 快指针:搜寻可以替换的元素

一旦快指针找到了不等同于val的值,将此值替换到慢指针的index,接着慢指针往右移动一位,直到快指针寻找到了下个不等于val的元素。

遍历终止条件:当快指针遍历到最后一个元素

返回:慢指针的下标,即不等于val的元素的数量

你可能感兴趣的:(leetcode)