代码随想录算法训练营第一天

34 阅读2分钟

704.二分查找

由于之前已经学过二分查找的基本思想,所以就不再赘述。这里主要对两种不同区间写法进行说明。

左闭右闭

这种情况下,由于左右都是能取到的,所以在初始定义区间时,要写为

left=0;right=len(nums)-1
  • while(left<=right)要写成<=,因为当left==right时是有意义的。
  • if nums[i]>target: right=mid-1.因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1

左闭右开

这种情况下,由于是[left,right),所以初始区间定义,要写为

left=0;right=len(nums)
  • while(left<right)要写成<,因为当left==right,无法取到[left,left)
  • if nums[i]>target: right=mid.因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]

27.移除元素

这道题如果使用暴力解法复杂度还是太高了,比较好的想法是去使用双指针解决这道题。
快指针去判断当前位置元素是否等于目标元素;慢指针负责去记录不同元素的数量

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        slow=0;fast=0
        for fast in range(len(nums)):
            if(nums[fast] != val):
                nums[slow]=nums[fast]
                slow+=1
        return slow

977.有序数组的平方

本题同样去使用快慢指针的思路;
快慢指针常见的有两种,一种是同一起点的,快指针先移动,慢指针后移动。还有一种是分别在列表的两端,共同向中间移动。
由于数组是有序的,那么数组的值进行平方后,最大的值肯定会出现在列表的首尾,由这个性质我们可以利用双指针的思想。将最大的值存入一个新的列表中,然后进行指针的移动。

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left=0;right=len(nums)-1
        result=[0]*len(nums)
        k=len(result)-1
        while left <= right:
            if nums[left]*nums[left]>nums[right]*nums[right]:
                result[k]=nums[left]*nums[left]
                k-=1
                left+=1
            else:
                result[k]=nums[right]*nums[right]
                k-=1
                right-=1
        return result