[Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]

【问题描述】[中等]

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。示例: 输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。

【解答思路】

1. 暴力法
  • 初始化子数组的最小长度为无穷大
  • 枚举数组nums 中的每个下标作为子数组的开始下标,对于每个开始下标 i,需要找到大于或等于 i 的最小下标 j,使得从 nums[i] 到nums[j] 的元素和大于或等于 s,并更新子数组的最小长度(此时子数组的长度是 j-i+1)。

时间复杂度:O(N^2) 空间复杂度:O(1)
在这里插入图片描述

class Solution {public int minSubArrayLen(int s, int[] nums) {int n = nums.length;if (n == 0) {return 0;}int ans = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {int sum = 0;for (int j = i; j < n; j++) {sum += nums[j];if (sum >= s) {ans = Math.min(ans, j - i + 1);break;}}}return ans == Integer.MAX_VALUE ? 0 : ans;}
}
2. 前缀和

在这里插入图片描述
时间复杂度:O(N^2) 空间复杂度:O(N)

public int minSubArrayLen(int s, int[] nums) {int n = nums.length;if (n == 0) {return 0;}int[] sums = new int[n];sums[0] = nums[0];for (int i = 1; i < n; i++) {sums[i] = nums[i] + sums[i - 1];}int min = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {int s2 = s - nums[i]; //除去当前数字for (int j = i; j < n; j++) {//i + 1 到  j 的所有数字和if (sums[j] - sums[i] >= s2) {min = Math.min(min, j - i + 1);}}}return min == Integer.MAX_VALUE ? 0 : min;
}
3. 前缀和+二分

在这里插入图片描述
在这里插入图片描述
时间复杂度:O(NlogN) 空间复杂度:O(N)
在这里插入图片描述

class Solution {public int minSubArrayLen(int s, int[] nums) {int n = nums.length;if (n == 0) {return 0;}int ans = Integer.MAX_VALUE;int[] sums = new int[n + 1]; // 为了方便计算,令 size = n + 1 // sums[0] = 0 意味着前 0 个元素的前缀和为 0// sums[1] = A[0] 前 1 个元素的前缀和为 A[0]// 以此类推for (int i = 1; i <= n; i++) {sums[i] = sums[i - 1] + nums[i - 1];}for (int i = 1; i <= n; i++) {int target = s + sums[i - 1];int bound = Arrays.binarySearch(sums, target);if (bound < 0) {bound = -bound - 1;}if (bound <= n) {ans = Math.min(ans, bound - (i - 1));}}return ans == Integer.MAX_VALUE ? 0 : ans;}
}

另一写法
在这里插入图片描述

public int minSubArrayLen(int s, int[] nums) {int n = nums.length;if (n == 0) {return 0;}int[] sums = new int[n];sums[0] = nums[0];for (int i = 1; i < n; i++) {sums[i] = nums[i] + sums[i - 1];}int min = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {int s2 = s - nums[i];//二分查找,目标值是 s2 + sums[i]int k = binarySearch(i, n - 1, sums, s2 + sums[i]);if (k != -1) {min = Math.min(min, k - i + 1);}}return min == Integer.MAX_VALUE ? 0 : min;
}//寻求刚好大于 target 的 sums 的下标,也就是大于等于 target 所有 sums 中最小的那个
private int binarySearch(int start, int end, int[] sums, int target) {int mid = -1;while (start <= end) {mid = (start + end) >>> 1;if (sums[mid] == target) {return mid;} else if (sums[mid] < target) {start = mid + 1;} else {end = mid - 1;}}//是否找到,没有找到返回 -1return sums[mid] > target ? mid : -1;
}/*
private int binarySearch(int start, int end, int[] sums, int target) {int mid = -1;while (start < end) {mid = (start + end) >>> 1;if (sums[mid] < target) {start = mid + 1;} else {end = mid ;}}//是否找到,没有找到返回 -1return sums[start] >= target ?start : -1;
}*/
4. 双指针

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(1)
在这里插入图片描述

class Solution {public int minSubArrayLen(int s, int[] nums) {int n = nums.length;if (n == 0) {return 0;}int ans = Integer.MAX_VALUE;int start = 0, end = 0;int sum = 0;while (end < n) {sum += nums[end];while (sum >= s) {ans = Math.min(ans, end - start + 1);sum -= nums[start];start++;}end++;}return ans == Integer.MAX_VALUE ? 0 : ans;}
}

【总结】

1.涉及连续子数组的问题,我们通常有两种思路:一是滑动窗口、二是前缀和
2.二分查找的关键就是那个递增的有序数列,从而可以每次抛弃一半的可选解。
3.Arrays类的binarySearch()方法

在这里插入图片描述

转载链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
参考链接https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-43/
参考链接:https://blog.csdn.net/cxhply/article/details/49423501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

29使用QRcode方式生成二维码

首先idea导入jar包 链接&#xff1a;https://pan.baidu.com/s/1IZvMHzL2tx1zB2UIbQtiOg 提取码&#xff1a;garc 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 import java.awt.Color;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import…

Mybatis入门---一对多、多对多

前几天自己配置了Mybatis的高级查询&#xff1a;一对多和多对多&#xff0c;现在记录一下&#xff0c;方便以后用到的时候再回顾&#xff0c;下面是具体的操作步骤 一、首先就是配置Mybatis的xml文件及mapper的xml文件&#xff0c;在这里就不多说了&#xff0c;之前写过这个基本…

[Leedcode][第215题][JAVA][数组中的第K个最大元素][快排][优先队列]

【问题描述】[中等] 在未排序的数组中找到第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k 2 输出: 5 示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k 4 输出: 4 说明:你可…

CF#420 B. Okabe and Banana Trees 思维|暴力|几何

Okabe needs bananas for one of his experiments for some strange reason. So he decides to go to the forest and cut banana trees. Consider the point (x, y) in the 2D plane such thatx andy are integers and0 ≤ x, y. There is a tree in such a point, and i…

30jquery-qrcode生成二维码

链接&#xff1a;https://pan.baidu.com/s/1KHzX_jFFBaw4QBKBR8UrgA 提取码&#xff1a;qmdo 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 如上所示&#xff0c;建立一个web程序 <% page language"java" contentType"text/html; charsetUTF-…

[剑指offer]面试题第[50]题[JAVA][第一个只出现一次的字符][哈希表][HashMap]

【问题描述】[简单] 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 s 只包含小写字母。示例:s "abaccdeff" 返回 "b"s "" 返回 " "【解答思路】 1. 哈希表 时间复杂度&#xff1a;O(N) 空间复…

31.javaweb简介

1 2 3 4 5 6 7javaweb程序简介

[剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]

【问题描述】[中等] 输入一个字符串&#xff0c;打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组&#xff0c;但里面不能有重复元素。示例: 输入&#xff1a;s "abc" 输出&#xff1a;["abc","acb","bac",&qu…

32tomcat的目录结构

<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>歌谣</title> </head> <bod…

[剑指offer]面试题第[52]题[Leedcode][第160题][JAVA][相交链表][双指针]

【问题描述】[简单] 【解答思路】 1. 双指针法 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA null || headB null) return null;ListNode pA headA, pB headB;while (pA !…

33tomcat目录结构

1创建一个myhome文件 2创建一个index.jsp文件 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><!DOCTYPE html><html><head><meta charset"utf-8"><title>歌…

复合数据类型,英文词频统计

作业要求&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2696 1.列表&#xff0c;元组&#xff0c;字典&#xff0c;集合分别如何增删改查及遍历。 列表的增删改查list1 list(this is a list)#增加list1.append(!) #末尾增加元素list1.insert(2,this i…

34tomcat设置默认页面

如何让hah.jsp成为欢迎界面&#xff1f; 在web-inf文件夹中配置项目部署文件web.xml。 添加标签 <welcome-file-list> <welcome-file>/hah.jsp</welcome-file> <welcome-file-list> 改变web.xml文件首页&#xff0c;报 将文件变成hah.jsp 默认页就设置…

[Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]

【问题描述】[中等] 给两个整数数组 A 和 B &#xff0c;返回两个数组中公共的、长度最长的子数组的长度。示例 1:输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的公共子数组是 [3, 2, 1]。 说明:1 < len(A), len(B) < 1000 0 < A[i], B[i] < 100…

[剑指offer]面试题第[53-1]题[JAVA][在排序数组中查找数字-1][二分法][暴力法]

【问题描述】[中等] 统计一个数字在排序数组中出现的次数。 示例 1:输入: nums [5,7,7,8,8,10], target 8 输出: 2 示例 2:输入: nums [5,7,7,8,8,10], target 6 输出: 0【解答思路】 1. 暴力法/遍历 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) public int…

[剑指offer]面试题第[53-2]题[JAVA][0-n-1中缺失的数字][二分法][暴力法]

【问题描述】[简单] 一个长度为n-1的递增排序数组中的所有数字都是唯一的&#xff0c;并且每个数字都在范围0&#xff5e;n-1之内。在范围0&#xff5e;n-1内的n个数字中有且只有一个数字不在该数组中&#xff0c;请找出这个数字。示例 1:输入: [0,1,3] 输出: 2 示例 2:输入: …

过拟合问题详解

具体内容来自于读芯术&#xff1a;https://mp.weixin.qq.com/s?__bizMzI2NjkyNDQ3Mw&mid2247487002&idx1&sn05d13bd67a31e38434285c5f0262b95d&chksmea87f6ccddf07fdae17a71819ba0577d099bb49b291093e7c6c7927456febfb3d8d308c30ad6&scene21#wechat_redir…

[Leetcode][第378题][JAVA][有序矩阵中第K小的元素][二分法][归并排序][暴力]

【问题描述】[中等] 给定一个 n x n 矩阵&#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是排序后的第 k 小元素&#xff0c;而不是第 k 个不同的元素。示例&#xff1a; matrix [[ 1, 5, 9],[10, 11, 13],[12, 13…