美文网首页
最长子数组长度问题

最长子数组长度问题

作者: 柴崎越 | 来源:发表于2019-02-28 22:41 被阅读0次

一,简单

1.1题目

图片.png

1,2解法

两个指针变量left和right,相当于是滑动窗体,根据sum(累加和)来判断是left移动还是right移动,k为目标值
1,如果sum==k,这是记录下数组的长度(len变量表示),在right之后的结尾的子数组一定大于当前的sum,所有left+1,开始考察left以后的子数组,同时把left对应的值(arr[left])除去.
2,如果sum>k,说明加上以right结束的子数组大了,查考left+1的子数组
3,如果sum<k,则right继续移动,同时需要判断,是否有溢出的危险

图解为 图片.png

1.3代码实现

public static int getMaxLength(int[] arr,int k)
    {
        if(arr==null||arr.length==0 || k<=0)
        {
            return 0;
        }
        int L=0;
        int R=0;
        int sum=arr[0];
        int len=0;
        while(R<arr.length)
        {
            if(sum==k)//等于的话,锁,并记录
            {
                len=Math.max(len,R-L+1);
                sum-=arr[L++];
            }
            else if(sum<k)//小于的话,继续扩,但是有越界的风险
            {
                R++;
                if(R==arr.length)
                {
                    break;
                }
            }
            else //大于的话,缩
            {
                sum-=arr[L++];
            }
        }
        
        return len;
    }

二,中等

2.1题目

图片.png

2.2分析

sum[j...i]=sum[i]-sumj

图片.png
需要记录s(j)的的值和位置,我们定义一个hashmap,key存加到当前的sum值(0到当前下标),value存其下标
图片.png
通过图可以知道我们key记录值,value记录出现这个值的最早的index
图片.png

注:边界问题

图片.png

2.3 代码实现

public static int maxLength(int[] arr, int k) {
        if (arr == null || arr.length == 0) {
            return 0;
        }
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        map.put(0, -1); // important
        int len = 0;
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
            if (map.containsKey(sum - k)) {
                len = Math.max(i - map.get(sum - k), len);
            }
            if (!map.containsKey(sum)) {
                map.put(sum, i);
            }
        }
        return len;
    }

三,复杂

相关文章

  • 最长子数组长度问题

    一,简单 1.1题目 1,2解法 两个指针变量left和right,相当于是滑动窗体,根据sum(累加和)来判断是...

  • 算法精选题总结之双指针法

    1.有序数组中平方取值的种类2.无重复字符的最长子串3.删除链表的倒数第N个节点4.数组中移除特定的元素5.长度最...

  • dp经典问题

    1. 最长子序列问题 最长上升不连续子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入:...

  • 动态规划设计

    1. 最长子序列问题 最长上升不连续子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入:...

  • 微软算法面试题:如何找最长的增长子序列

    来自:码农网,英文原文,译者:小峰 这个问题是微软提出来的。 给定一组数字,找出数组中最长的增长子序列的长度。子序...

  • 最长递增子序列(LIS)

    使用数组len来记录前i个元素最长子序列的长度,因此len[i+1]=max{1,len[k]+1},arr[i+...

  • C++数组长度可以为变量吗?

    关于C++数组提出几点问题: 预备 先看下这两段代码 变量作为数组的长度可行吗? 输出: 访问超过长度的数组下标的...

  • C++数组长度可以是变量吗

    关于C++数组提出几点问题: 预备 先看下这两段代码 变量作为数组的长度可行吗? 输出: 访问超过长度的数组下标的...

  • NO.32 数组的遍历与获取最值问题

    数组遍历:就是依次输出数组中的每一个元素。(运用for循环) 数组的属性:arr.length数组的长度 数组的最...

  • 【算法】字符串和数组操作01

    1、无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 **最长子串 **的长度。 示例: 2、最...

网友评论

      本文标题:最长子数组长度问题

      本文链接:https://www.haomeiwen.com/subject/gidluqtx.html