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

【算法】【数组与矩阵模块】正数组中累加和为给定值的最长子数组长度,空间复杂度O(1)解法

目录

  • 前言
  • 问题介绍
  • 解决方案
  • 代码编写
    • java语言版本
    • c语言版本
    • c++语言版本
  • 思考感悟
  • 写在最后

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

在此感谢左大神让我对算法有了新的感悟认识!

问题介绍

原问题
给定正数组,求正数组中累加和为给定值的最长子数组长度
如:
arr = {1, 3, 2, 5, 4, 7, 8}, k = 10
结果为:3,数组{3,2,5} 为最长子数组

解决方案

原问题
解法一(空间O(n)):
参考:

https://swzhao.blog.csdn.net/article/details/126942975

该解法可以适配非正数无序数组,但是空间复杂度为O(n)
解法二(空间O(1)):
1、申请两个变量left,right,作为滑动窗口的两端,申请一个变量sum作为滑动窗口的和,实时计算
2、在left和right滑动的过程中,sum作为和,如果 sum < k ,说明和小了,right++扩大窗口
3、反之说明和大了,left++减小窗口即可,因为正数数组,因此和sum一定会减少

代码编写

java语言版本

原问题:

    public static int maxLen2K(int[] arr, int k) {if (arr == null || arr.length == 0) {return 0;}// 两个游标从开始游走left<= rightint left = 0, right = 0;// sum为了实时保存left到right的和int sum = arr[0];// 结果int len = 0;while (left <= right && right <= arr.length) {if (sum == k) {len = Math.max(len, right - left + 1);// 这里right尽可能的远right++;// 更新sumsum += right > arr.length ? 0 : arr[right];}else if (sum < k) {// 小了,需要拓展right++;sum += right >= arr.length ? 0 : arr[right];}else {// 大了,需要缩小sum -= arr[left];left++;}}return len;}public static void main(String[] args) {int[] ints = {1, 3, 2, 5, 4, 7, 8};int[] ints1 = {-3, -1, -4, 6, 3, -3, 5, 6, 0};int[] ints2 = {0, 1, 1, 0, 0, 0, 0, 1, 0};int[] ints3 = {3, -2, -4, 0, 6};//System.out.println(myGetMaxLenth(ints, 8));//System.out.println(myGetMaxLengthFromPG(ints1));//System.out.println(myGetMaxLengthFrom01(ints2));System.out.println(maxLen2K(ints, 10));}

c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

其实参考里面的解法我认为是这种类型问题的统一解法,这篇文章主要介绍的是滑动窗口的玩法,有兴趣可以看一下,还是比较简单的。

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!

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

相关文章:

  • 3.1.2 创建表
  • 使用netlify实现自动化部署前端项目(无服务器版本)
  • MATLAB点云数据处理(二十九):可视化点云之pcshow参数详解与快捷键操作
  • 顺序表——重置版
  • PyQt5自然语言处理入门案例笔记
  • 使用 CSS 替换表行颜色?
  • 智能家居控制系统
  • Linux 进程:fork()与vfork()的对比
  • 环境搭建02-Ubuntu16.04 安装CUDA和CUDNN、CUDA多版本替换
  • HOT100--(3)无重复字符的最长子串
  • vue keep-alive多层级路由支持
  • 从源码角度看React-Hydrate原理
  • ARM基础 -- 2
  • Java 类型转换
  • 【Java开发】JUC基础 05:线程通信/协作
  • 哪些工具可以实现在线ps的需求
  • 如何使用C2concealer生成随机化的C2 Malleable配置文件
  • 网络基础之IP地址和子网掩码
  • G1D54-CRF
  • vue3 使用defineAsyncComponent与component标签实现动态渲染组件
  • Linux下 C/C++ NTP网络时间协议详解
  • Pytest自动化框架-权威教程02-Pytest 使用及调用方法
  • 大数据技术——概述
  • java-代理模式
  • 路由网络的构建与配置
  • 软件测试-接口测试-数据库管理
  • 【华为OD机试 】天然蓄水库(C++ Java JavaScript Python)
  • 普元EOS中导出excl页面下载
  • 内存的管理
  • OpenFeign 切换HttpClient遇到的问题