长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。示例: 输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
进阶:如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

我的解答:

第一版本:有问题的版本
class Solution {public int minSubArrayLen(int s, int[] nums) {
/*        第一版:   思路有问题  213[12,28,83,4,25,26,25,2,25,25,25,12]*/if (nums == null || nums.length == 0) {return 0;}int maxNumber = 0;int maxNumIndex = 0;int total = 0;int length = nums.length;for (int i = 0; i < length; i++){if (nums[i] > maxNumber) {maxNumber = nums[i];maxNumIndex = i;}total += nums[i];}if (total < s){return  0;}else if (maxNumber >= s){return maxNumIndex;}int min = 0;total = 0;int lenghth1 = 0;// 从 maxIndex 往后遍历for (int number = maxNumIndex; number < length ; number++) {total += nums[number];lenghth1 ++;if (total >= s) {min = lenghth1;break;}}total = 0;int lenghth2 = 0;// 从 maxindex 向前遍历for (int number = maxNumIndex; number >=0 ; number--) {total += nums[number];lenghth2 ++;if (total >= s) {min =min !=0 ? Math.min(min,lenghth2) : lenghth2;break;}}int lenghth3 = 0;if (maxNumIndex != 0 && maxNumIndex != length -1) {lenghth3 = 1;// 从maxIndex 从中间往两边遍历for (int i = maxNumIndex-1 ,j= maxNumIndex+1; j >0 && j< length  && i < length && i>=0 ;i ++,j--) {total += nums[i]+nums[j];lenghth3 +=2;if (total >= s) {min =min !=0 ? Math.min(min,lenghth3) : lenghth3;break;}}}return min;}}

当时我的想法是:找到最大的那个数,要找的和肯定是最大的数组成的子数组长度比较小。后来忘了,如果说,该数很大,但是周围都是1,也比不过其他比他小,但是周围都是同等大的数。比如:1,1,1,23,1,1,1,1,18,18,18.

第二版:实在想不出来方法,就用循环遍历去做吧。

class Solution {public int minSubArrayLen(int s, int[] nums) {if (nums == null || nums.length == 0) {return 0;}int maxNumber = 0;int total = 0;int length = nums.length;for (int i = 0; i < length; i++){if (nums[i] > maxNumber) {maxNumber = nums[i];}total += nums[i];}if (total < s){return  0;}else if (maxNumber >= s){return 1;}int minCont = 0;for (int i = 0; i < length; i++) {total = 0 ;total += nums[i];for (int j = i+1;j < length;j++){total += nums[j];if (total >= s) {minCont =minCont !=0 ? Math.min(j-i,minCont) :j-i;break;}}}return ++minCont;}}

肯定有很多重复遍历。

网上最快的方法:

class Solution {public int minSubArrayLen(int s, int[] nums) {// copy from leetcode.comif (null == nums || nums.length == 0) { return 0; }int i = 0, j = 0;int sum = 0, minLen = Integer.MAX_VALUE;while (j < nums.length) {sum += nums[j++];if (sum < s) { continue; }while (sum >= s) {sum -= nums[i];i++;}minLen = Math.min(minLen, j - i + 1);}return (minLen == Integer.MAX_VALUE) ? 0 : minLen;}
}

总结

1.感觉自己解决问题的思路,还是有很多的可以提高的地方。
2.之前练习的算法题,要时常回顾。现在发现,让自己现在去在脑海里做,
思路都不是很明确。这样不行。
3.自己想到的一些情况,也要代码去处理,而不是有特殊情况,自己直到,但是什么也没有做。
应该写代码处理这些特殊情况。

加油,少年。

算法------长度最小的子数组相关推荐

  1. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II. 977.有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977.有序数组的 ...

  2. 代码随想录算法训练营第二天|leetcode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    leetcode 977.有序数组的平方 想到昨天写的双指针,十分刻意用了一下,感觉还是比较生疏,还得加强练习和思考,然后发现还需要排序,想到了vector的排序sort(),但是觉得直接用不好,也忘 ...

  3. 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...

  4. 代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...

  5. Leonard代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    第一章数组 (今日任务) 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结 建议大家先独立做题,然后看视频讲解,然后看文章讲解,然后在重新做一遍题,把题目AC,最后整理 ...

  6. 代码随想录算法训练营第二天|LeetCode977.有序数组的平方,209.长度最小的子数组, 59.螺旋矩阵II

    题目连接:977.有序数组的平方 暴力法:将数组所有元素平方然后再排序(未利用题目条件:原始数组按照非降序排列) 双指针法:数组中各元素符号有三种情况:①所有元素非负(将数组中元素平方即可).②所有元 ...

  7. 【Leetcode数组--子数组--滑动窗口】209. 长度最小的子数组 904. 水果成篮 1004. 最大连续1的个数 III 76. 最小覆盖子串(有数组操作中重要的方法:滑动窗口!!!!)

    文章目录 Leetcode209 1.问题描述 2.解决方案 解法一:两个错误思路的算法 解法二:暴力 解法三:滑动窗口法(O(n)) Leetcode904 1.问题描述 2.解决方案 Leetco ...

  8. 代码随想录Day02 | LeetCode977.有序数组的平方、LeetCode209.长度最小的子数组、LeetCode59.螺旋矩阵II

    977.有序数组的平方 力扣题目链接(opens new window) 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: ...

  9. 代码随想录第二天 |LeetCode977.有序数组的平方,LeetCode209.长度最小的子数组,LeetCode59.螺旋矩阵II

    LeetCode977.有序数组的平方 977. 有序数组的平方 - 力扣(LeetCode) 暴力解法: 一开始不习惯用双指针解法,习惯性先平方再用双指针,发现做不出了HH.于是愉快的用传统暴力解法 ...

最新文章

  1. C++中extern的使用
  2. 从一个Bug开始,重新认识一个强大的 Gson
  3. GridView 模版列编辑状态Dropdownlist 事件
  4. 英文文献中的数学符号
  5. 深度学习搞docker真的搞的我心态炸裂
  6. SDN第二章 win10远程桌面Ubuntu
  7. nginx基础概念(100%)之lingering_close
  8. 英伟达斥资 400 亿美元收购 Arm,欲向 Arm 员工发 15 亿美元股票
  9. Java script生成apk_Android 命令行编译、打包生成apk文件
  10. 那个清华哈佛双料女学霸, 辞职了
  11. linux下代码覆盖率检查工具---gcov的用法
  12. 华为自带计算机怎么算平方立方,智能家庭中心:华为荣耀立方体验评测
  13. 网易云ios android 自定义消息,网易云信快速集成定制以及消息类型自定义
  14. hp打印机没有右键扫描_win10打印机右键没有‘开始扫描’的修复办法
  15. 芝麻授权 java调用_手机浏览器怎么调用支付宝进行用户授权呢?
  16. SQL Server中Id自增列的最大Id是多少
  17. 232串口线或者串口的简单测试
  18. 机器学习——回归中的相关度与R平方值及其应用
  19. oracle 12 去掉 cdb,Oracle 12c no-CDB转换为CDB
  20. golang版google pay 支付验证

热门文章

  1. python命名空间更改_在Python中使用ElementTree改变命名空间前缀
  2. 打印机是微型计算机必须配置的一种,计算机第一章测试卷
  3. 驰骋工作流引擎设计系列05 启动流程设计
  4. WPF:Graphics图表--EncodingAndersonDecoding图像编解码(2)
  5. java边遍历边删除的问题
  6. MongoDB之bson的介绍
  7. android 多用户管理UserManager
  8. AJAX服务器返回数据 连接数据库查询数据
  9. Photoshop制作一只可爱的卡通小鸟
  10. asp.net开源CMS推荐