当前位置: 首页 > news >正文

力扣每日一练(24-1-20)

 

      大脑里的第一想法是排列组合,直接给出超级准确的最优解。

        但不适用,hhh

        只要连续的n个元素大于或者等于target就可以了

        题目比自己想象的要好解决

        解法是使用滑动窗口算法。这个算法的基本思想是维护一个窗口,使得窗口内的元素总和大于等于目标值,然后尝试缩小窗口以找到最小的满足条件的子数组。

Python

class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:n = len(nums)ans = n + 1start = 0end = 0total = 0while end < n:total += nums[end]while total >= target:ans = min(ans, end - start + 1)total -= nums[start]start += 1end += 1return 0 if ans == n + 1 else ans

C#

public class Solution {public int MinSubArrayLen(int target, int[] nums) {int n = nums.Length;int ans = n + 1;int start = 0;int end = 0;int total = 0;while (end < n) {total += nums[end];while (total >= target) {ans = Math.Min(ans, end - start + 1);total -= nums[start];start++;}end++;}return ans == n + 1 ? 0 : ans;}
}

        解法的时间复杂度是O(n),因为每个元素最多被访问两次。

二分查找法

        在这个问题中,O(n)的滑动窗口解法已经是最优解法,因为它只需要遍历一次数组。然而,如果你想要实现一个O(n log n)的解法,你可以使用二分查找的方法。这种方法的基本思想是先计算累积和数组,然后对每个累积和,使用二分查找找到最小的索引j,使得sum[j] - sum[i] >= target。

        以下是这个方法的Python实现:

Python

import bisectclass Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:n = len(nums)ans = n + 1sums = [0] * (n + 1)for i in range(1, n + 1):sums[i] = sums[i - 1] + nums[i - 1]for i in range(1, n + 1):to_find = target + sums[i - 1]bound = bisect.bisect_left(sums, to_find)if bound != len(sums):ans = min(ans, bound - (i - 1))return 0 if ans == n + 1 else ans

C#

public class Solution {public int MinSubArrayLen(int target, int[] nums) {int n = nums.Length;int ans = n + 1;int[] sums = new int[n + 1];for (int i = 1; i <= n; i++) {sums[i] = sums[i - 1] + nums[i - 1];}for (int i = 1; i <= n; i++) {int to_find = target + sums[i - 1];int bound = Array.BinarySearch(sums, to_find);if (bound < 0) {bound = ~bound;}if (bound <= n) {ans = Math.Min(ans, bound - (i - 1));}}return ans == n + 1 ? 0 : ans;}
}

http://www.lryc.cn/news/284463.html

相关文章:

  • Pytest系列(2) - assert断言详细使用
  • CodeWave智能开发平台--03--目标:应用创建--10初级采购管理系统总结
  • 外包干了4个月,技术退步明显.......
  • 图片批量建码怎么用?每张图片快速生成二维码
  • 时间复杂度的排序
  • js控制浏览器前进、后退、页面跳转
  • 【长文阅读】MAMBA作者博士论文<MODELING SEQUENCES WITH STRUCTURED STATE SPACES>-Chapter1
  • Unity3D学习之UI系统——GUI
  • 用户ssh正确密码登陆均报错Permission denied, please try again.处理方法
  • IO、NIO、IO多路复用
  • 探索FTP:原理、实践与安全优化
  • git中的语法和术语含义
  • java SECS管理系统 将逐步推出 SECS 客户端(Passive) 管理系统 SECS快速开发平台 springboot secs开发平台
  • 使 a === 1 a === 2 a === 3 为 true 的几种“下毒“方法
  • Canny边缘检测 双阈值检测理解
  • 自动化测试:5分钟了解Selenium以及如何提升自动化测试的效果
  • 【MySQL】——关系数据库标准语言SQL(大纲)
  • 力扣hot100 最长有效括号 动态规划
  • @RequestBody注解基础
  • 前端基础面试题大全
  • 第一讲_HarmonyOS应用开发环境准备
  • 一、可行性研究报告模板(软件工程)
  • DBA技术栈MongoDB:简介
  • 贪心算法 ——硬币兑换、区间调度、
  • 【已解决】namespace “Ui“没有成员 xxx
  • Spring Bean 生命周期的执行流程?
  • Android-三方框架的源码
  • AI嵌入式K210项目(15)-安全散列算法加速器
  • Docker Consul详解与部署示例
  • 内网安全管理系统(保密管理系统)