[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度

题目描述

给定无序数组,每个值均为正数,再给定整数k。求arr中所有子数组中所有元素相加和为k的最长子数组长度。无则输出-1。
例:
输入 arr=[1,2,1,1,1],k=3
输出 3

解题思路 (时间复杂度O(N),空间复杂度O(1))

维护指针l,r表示子数组区间。初始l=r=0,向右移动至r=arr.length结束。
维护当前子数组和sum,及到当前为止满足题意的最大len。初始sum=arr[0],len=-1。
每次比较sum和k,根据情况选择移动l还是r,并更新sum和len。

代码

public static int longestEqualStrLen(int[] arr,int k) {
        int l=0;
        int r=0;
        int sum=arr[0];
        int len=-1;
        while(r<arr.length) {
            if(sum<k) {
                r++;
                if(r==arr.length) {
                    break;
                }
                sum+=arr[r];
            }
            else if(sum>k) {
                l++;
                sum-=arr[l];
            }
            else {
                if(r-l+1>len) {
                    len=r-l+1;
                }
                l++;
                sum=-arr[l];
            }
        }
        return len;
    }

原文地址:https://www.cnblogs.com/coding-gaga/p/10835790.html

时间: 2024-08-14 22:04:29

[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度的相关文章

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

一天一道算法题(1)---未排序数组中累加和为给定值的最长子数组

题目 给定一个无序数组arr,其中元素可正,可负,可0,给定一个整数k.求arr所有的子数组中累加和为k的最长子数组长度. 分析 为了解答题目,引入一个概念,s(i)代表子数组arr[0..i]所有元素的累加和.那么子数组arr[j-1, i](0<=j<=i<arr.length)的累加和为s(i)-s(j-1). 1. 设置变量sum=0,表示从0位置开始一直加到i位置所有元素的和.设置变量len=0,表示累加和为k的最长子数组长度.定义一个HashMap,其中key是sum值,va

未排序数组中累加和为给定值的最长子数组长度

题目:给定一个数组arr,该数组无序,但每个值均为正数,再给定一个正数k.求arr得所有子数组中所有元素相加和为k的最长子数组长度. 解答:最优解可以做到时间复杂度为o(n),额外空间复杂度为o(1).首先用两个位置来标记子数组的左右两头,记为left和right,开始时都在数组的最左边(left=0,right=0).整体过程如下: 1.开始时变量left=0,right=0,代表子数组arr[left......right]. 2.变量sum始终表示子数组arr[left......righ

算法总结之 未排序正数数组中累加和为给定值的最长子数组长度

例如  arr=[1,2,1,1,1]   k=3 累加和为 3的最长子数组为[1,1,1]   所以结果为3 思路方法: 两个指针 left  和right   初始值都是0  都在左边 sum 代表 子数组 left.....right的和 len 一直记录累加和为k的所有子数组中最大子数组的长度 根据 sum与k的比较结果决定  left 跟 right 哪一个移动!!!! package TT; public class Test70 { public static int getMax

算法总结之 未排序数组中累加和小于或等于给定值的最长子数组长度

给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数k,求arr所有的子数组中累加和小于或等于k的最长子数组长度. 例如: arr=[3,-2,-4,0,6] , k=-2, 相加和小于或者等于-2的最长子数组为{3,-2,-4,0}, 所以结果返回4 解题思想: 预处理思想,把信息记录下来 累加和数组的改变 累加和数组中的最大值 用二分查找第一个大于等于某个值的位置 有序适合用二分查找 首先生成 sumArr  就是累加后的数组   这个数组大哦  因为 第一个为0 表示当没有任何一

未排序数组中累加和小于或等于给定值的最长子数组长度

题目描述 给定一个无序数组arr,其中元素可正.可负.可0.给定一个整数k,求arr所有的子数组中累加和小于或等于k的最长子数组长度 要求 时间复杂度为O(n),空间复杂度为O(n) 示例 输入描述 第一行两个整数N, k.N表示数组长度,k的定义已在题目描述中给出 第二行N个整数表示数组内的数 输出描述 输出一个整数表示答案 示例1 输入 5 -2 3 -2 -4 0 6 输出 4 备注 \(1 \leq N \leq 10^5\) $-10^9 \leq k \leq 10^9 $ $-10

《程序员代码面试指南》第八章 数组和矩阵问题 将正方形矩阵顺时针转动90

题目 将正方形矩阵顺时针转动90 java代码 package com.lizhouwei.chapter8; /** * @Description: 将正方形矩阵顺时针转动90 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:16 * @Modify by: * @ModifyDate: */ public class Chapter8_2 { public void rotate(int[][] matrix) { int tR = 0; i

《程序员代码面试指南》第八章 数组和矩阵问题 &quot;之&quot;字形打印矩阵

题目 "之"字形打印矩阵 java代码 package com.lizhouwei.chapter8; /** * @Description: "之"字形打印矩阵 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:53 * @Modify by: * @ModifyDate: */ public class Chapter8_3 { public void printMatrixZigZag(int[][] matri

《程序员代码面试指南》第八章 数组和矩阵问题 自然数数组的排序

题目 自然数数组的排序 java代码 package com.lizhouwei.chapter8; /** * @Description: 自然数数组的排序 * @Author: lizhouwei * @CreateDate: 2018/5/8 20:51 * @Modify by: * @ModifyDate: */ public class Chapter8_14 { public void sort(int[] arr) { int left = 0; int right = arr.