zoukankan      html  css  js  c++  java
  • [程序员代码面试指南]数组和矩阵-未排序数组中累加和为给定值的最长子数组长度

    题目描述

    输入无序数组arr,元素可正可负可0,再给整数k,求arr所有子数组中累加和为k的最长子数组长度。

    解题思路

    三个变量:
    sum为pos为0到i的所有元素的累加和;
    len为当前满足题意的最长子数组长度;
    map key为从arr最左边开始累加的过程中出现过的sum值,value表示sum值最早出现的位置,因为要求最长的。

    遍历一遍,维护sum;len=>更新看在map中是否存在sum-k,因为sum-(sum-k)=k;map。

    特别的,map初始化要先放入key=0 value=-1,否则因为sum(i)-sum(j)=arr[j+1,i]的累加和,以0开始的子数组将全部被忽略。

    代码

    public class Solution{
    	public int getLongestStrLen(int arr[],int k) {
    		int sum=0;
    		int len=-1;
    		HashMap<Integer,Integer> firstAccurMap=new HashMap<Integer,Integer>();
    		firstAccurMap.put(0, -1);
    		for(int i=0;i<arr.length;++i) {
    			sum+=arr[i];
    			if(firstAccurMap.containsKey(sum-k)) {
    				int begPos=firstAccurMap.get(sum-k);
    				if(i-begPos>len) {
    					len=i-begPos;//
    				}
    			}
    			if(!firstAccurMap.containsKey(sum)) {
    				firstAccurMap.put(sum, i);
    			}
    		}
    		return len;
    	}
    }
    
  • 相关阅读:
    jquery ajax参数详解
    压缩解压函数实现
    WCF 大数据量如何从服务端传到客户端
    [DllImport("kernel32.dll")]
    Oracle数据库使用基础和实例
    Js常用的动态效果
    Js使用正则实现表单验证
    Oracle数据库理论知识
    HTML5,CSS3,JavaScript基础知识与使用
    速读《人月神话》
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10841728.html
Copyright © 2011-2022 走看看