数组1. 双指针在数组问题中的一些基本应用

469 阅读2分钟

1. 二分查找法

  1. 重点关注代码中标注的易错的四个要点地方
  2. 两种解法的区别在于 边界条件,即区间的开闭 ,需要理解
解法 1 :在左闭右闭区间求解
def binarysearch(a, num):
    length = len(a)
    low = 0
    high = length - 1 # 注意此时减一
    while low <= high:  # 注意等于号
        mid = int(low + ((high - low) / 2)) ##使用(low+high)/2会有整数溢出的问题
        if a[mid] < num:
            low = mid + 1 #注意区间缩小
        elif a[mid] > num:
            high = mid - 1 #注意区间缩小
        else:
            return mid
    return -1
解法 2 :在左开右闭区间上求解
def binarysearch(a, num):
    length = len(a)
    low = 0
    high = length # 变了
    while low < high: # 变了
        mid = int(low + ((high - low) / 2)) 
        if a[mid] < num:
            low = mid + 1
        elif a[mid] > num:
            high = mid  # 变了
        else:
            return mid
    return -1

2. move zeros(移动零元素至末尾问题 283)

  • r 向前探索,依次找到所有的非零元素,借助 L 移动到整个数组的最前面,最后再将(L,R)全部置零

    • 遇到非零 :arr[L] = arr[R],:L++,R++
    • 遇到 0 :r++
# 解法 1
    def moveZeroes(self, nums: List[int]) -> None:
        l = 0
        for r in range(len(nums)):
            if nums[r] != 0:
                nums[l] = nums[r]
                l += 1
                r += 1
            else:
                r += 1
        for i in range(l,r):
            nums[i] = 0
# 解法 2
    def moveZeroes(self, nums):
        zero = 0  # records the position of "0"
        for i in xrange(len(nums)):
            if nums[i] != 0:
                nums[i], nums[zero] = nums[zero], nums[i]
                zero += 1

3.删除排序数组中的重复项 (26)

  • i 守住数组的前面该放元素的位置,j 向前探索,遇到前面没有的 --> 拉回交换,否则,不断探索,直到找完所有该放的元素。
size = len(nums)
        i = 0 
        for j in range( size ):
            if nums[j] != nums[i]:
                nums[i+1] = nums[j]
                i += 1
                j += 1
            else:
                j += 1
        return i+1

4.删除排序数组中的重复项 II (80)

  • 因为是排序的,所以如果 nums[i] == nums[i-k] 说明 k 个不重复元素已经够了。直到不等于时说明出现了需要移动的元素,移动到i位置,i++ 即可 (为了防止数组元素长度不足导致数组越界,加上判断语句 i<2 时不操作语句)
# 1.此题解法
def removeDuplicates(self, nums: List[int]) -> int:
        i = 0
        for n in nums:
            if i < 2 or n != nums[i-2]:
                nums[i] = n
                i += 1
        return i
# 2.通用解法
class Solution:
    def removeDuplicates(self, nums, k):
        i = 0
        for n in num]s:
            if i < k or n != nums[i-k]:
                nums[i] = n
                i += 1
        return i