leetcode 二分查找 day1

目录

209. 长度最小的子数组

思路:

代码:

611.有效的三角形个数

思路:

代码:

反思:


209. 长度最小的子数组

209. 长度最小的子数组 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M276https://leetcode-cn.com/problems/minimum-size-subarray-sum/

思路:

1.滑动窗口,窗口长度最小值即为答案

2.看到排序完了的数组,喜之

3.首先判断是否为空数组,空数组直接返回0

4.设置左右窗口为0,0并设置初始ans为一个取不到的数比如n+1 n为数组长度,这样可以用于判断是否能够满足题意

5.每次循环时,窗口向右移动,总和加上右边的值,循环条件是又边界小于数组的长度。

6.循环的时候进行判断,如果当前的总和大于等于target,进入嵌套循环,这个循环的目的是将窗口左端右移来找窗口的最小值,每次循环的时候,先比较当前窗口长度和ans的大小,取较小值作为ans,然后减去左边的值且左端右移

7.循环结束判断ans 如果ans为n+1说明无法满足,返回0,其他情况返回ans

代码:

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        # 滑动窗口
        if not nums:
            return 0

        left, right = 0, 0
        n = len(nums)
        ans = n + 1 # 这里设置一个较大的无法达到的值作为检测
        s = 0 # 为什么这里初始是0 ?
        while right < n:
            s += nums[right]
            while s >= target:
                ans = min(ans, right - left + 1)
                s -= nums[left]
                left += 1
            right += 1
        return 0 if ans == n + 1 else ans

611.有效的三角形个数

611. 有效三角形的个数 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M276https://leetcode-cn.com/problems/valid-triangle-number/

思路:

1.列表未排序,先对列表进行排序才方便后续操作

2.选用双指针,可以以O(nlogn)的时间复杂度完成本题

3.设置一个ans储存答案个数。在列表中先固定一个值,第一个值从列表的第一个值开始取,第二个值放在第一个值之后,第三个值第二个值之后开始取,先动第三个指针,第三个指针对应的第一个值都不满足三角形,那么直接结束内层循环,因为后续的值会更大,更加无法满足三角形条件,结束后将第二个指针向后移动,依次循环

代码:

class Solution:
    def triangleNumber(self, nums: List[int]) -> int:
        # 这题一定需要排序
        nums.sort()
        n = len(nums)
        ans = 0
        # i j k 顺着来就好 从小往大 不要用对撞
        for i in range(n):
            k = i + 1 # 写在下一个循环里面会超时卧槽
            for j in range(i+1, n):
                while k + 1 < n and nums[i] + nums[j] > nums[k + 1]:
                    # 这里是k+1因为是要下一个满足再移动
                    k += 1
                ans += max(0, k-j)
        return ans

反思:

两道题,都说是二分查找,结果都没有用到二分查找

以上

坚持 共勉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值