代码随想录算法训练营|Day 1

Day 1内容:

数组理论基础
文章链接:https://programmercarl.com/数组理论基础.html

题目

个人情况:
今天三道题目中两道题目我之前自己刷过,参考资料有代码随想录网站上的内容与力扣上别人的题解。今天可以算作是部分复习加上部分新知识。

二分查找
二分查找的区间问题:
在这道题,数组中要么是<target的元素,要么是>=target的元素。定义一个区间的意义在于,左区间外的都是<target的,右区间外都是>=target的。通过找到数组中第一个>=target的元素,并看它是否是target自身,可以确定数组中是否有该元素,并确定返回内容
[left, right]:

点击查看代码
while left <= right:
    mid = left + (right-left) //2
    if num[mid] >= target:
        right = mid-1
    else:
        left = mid + 1
#循环结束时区间无元素
#循环结束后区间变成[right, left]
#left=right+1
#左区间外都<target,那么left就是第一个>=target的元素
#return left
[left, right):
点击查看代码
while left < right:
    mid = left + (right-left) //2
    if num[mid] >= target:
        right = mid
    else:
        left = mid + 1
#循环结束时区间无元素
#循环结束后区间变成left=right   [left,right)
#左区间外都<target,那么left就是第一个>=target的元素
#return left or right均可

(left, right):
点击查看代码
while left +1 < right:
    mid = left + (right-left) //2
    if num[mid] >= target:
        right = mid
    else:
        left = mid 
#循环结束时区间无元素
#循环结束后区间变成left+1=right   (left,right)
#左区间外都<target, 由于开区间,left本身就在区间外
#因此nums[left] < target
#left+1即right才是第一个>=target的元素
#return right or left+1
关键点: 一边区间外的都是我们想要的元素,一边区间外的则不是 区间问题把握“区间外”的想法能很快确定代码

双指针/快慢指针
fast指针负责遍历列表,slow指针记录不符合要求的位置(这个元素我们不想要它在那个位置)。
如果元素在合适的位置,slow和fast会同步前进。一旦遇到了不合适的,slow会停止,fast继续。
当fast遇到了合适的,就和slow位置的交换。然后slow再正常前进。

704.二分查找

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

27.移除元素

点击查看代码
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        slow = 0
        fast = 0
        while fast <= len(nums)-1:
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

977.有序数组的平方 不会写
点击查看代码
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        n=len(nums)
        ans = [0]*n
        i,j,p=0,n-1,n-1
        while i <= j:
            x = nums[i]*nums[i]
            y = nums[j]*nums[j]
            if x > y:
                ans[p] = x
                i += 1
            else:
                ans[p] = y
                j -= 1
            p -= 1
        return ans
            
照抄了网站上的思路
posted @ 2025-06-11 15:49  ForeverEver333  阅读(439)  评论(0)    收藏  举报