zoukankan      html  css  js  c++  java
  • 子数组之和

    给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置

    样例

    给出[-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3].

    思路:这道题最开始我的想法是用两重宣传去查找第一组连续数字和为0的两端,会发现这种情况算法的复杂度是O(n*n);应该是挺复杂的方法;之后又看到了这样的算法,我们从第一个开始,把对于每一个元素而言的前n项和求出来,当出现sum(j)=sum(i)(j>i)时,即可认为第i+1项到第j项的总和为0;这是一个很巧妙的算法。所以我们建立一个前n项和的数组,并且进行一次排序即可得到结果。复杂程度为O(nlogn)

     1 class Element implements Comparable<Element>{
     2     int index;
     3     int value;
     4     public Element (int i,int v){
     5         index = i;
     6         value = v;
     7     }
     8     public int compareTo(Element other){
     9         return this.value-other.value;
    10     }
    11     public int getIndex(){
    12         return index;
    13     }
    14     public int getValue(){
    15         return value;
    16     }
    17 }
    18 public class Solution {
    19     /**
    20      * @param nums: A list of integers
    21      * @return: A list of integers includes the index of the first number 
    22      *          and the index of the last number
    23      */
    24     public ArrayList<Integer> subarraySum(int[] nums) {
    25         // write your code here
    26         ArrayList<Integer> res = new ArrayList<Integer>();
    27         if(nums == null || nums.length == 0)   return res;
    28         int len = nums.length;
    29         Element[] sums = new Element[len+1]; 
    30         sums[0]= new Element(-1,0);
    31         int sum =0;
    32         for(int i=0;i<len;i++){
    33             sum += nums[i];
    34             sums[i+1]= new Element(i,sum);
    35         }
    36         Arrays.sort(sums);
    37         for(int i=0;i<len;i++){
    38             if(sums[i].getValue()==sums[i+1].getValue()){
    39                 int m = Math.min(sums[i].getIndex(),sums[i+1].getIndex())+1;
    40                 int n = Math.max(sums[i].getIndex(),sums[i+1].getIndex());
    41                 res.add(m);
    42                 res.add(n);
    43                 return res;
    44             }
    45         }
    46         return res;
    47     }
    48 }
  • 相关阅读:
    [国家集训队] Crash 的文明世界
    [国家集训队] middle
    [正睿集训2021] 构造专练
    [正睿集训2021] LIS
    CF482E ELCA
    UVA
    UVA
    UVA
    UVA
    UVA
  • 原文地址:https://www.cnblogs.com/wangnanabuaa/p/5008648.html
Copyright © 2011-2022 走看看