zoukankan      html  css  js  c++  java
  • Lintcode: Subarray Sum Closest

    Given an integer array, find a subarray with sum closest to zero. Return the indexes of the first number and last number.
    
    Have you met this question in a real interview? Yes
    Example
    Given [-3, 1, 1, -3, 5], return [0, 2], [1, 3], [1, 1], [2, 2] or [0, 4].
    
    Challenge
    O(nlogn) time

    Analysis:

    s[i+1] = nums[0]+....nums[i], also record the index i into s[i+1]. Sort array s, and the minimum difference between two consecutive element, is the the subarray.

     1 class Element implements Comparable<Element> {
     2         int index;
     3         int value;
     4         public Element(int index, int value) {
     5             this.index = index;
     6             this.value = value;
     7         }
     8         
     9         public int compareTo(Element other) {
    10             return this.value - other.value;
    11         }
    12         
    13         public int getIndex() {
    14             return index;
    15         }
    16         
    17         public int getValue() {
    18             return value;
    19         }
    20 } 
    21      
    22 
    23 
    24 
    25 public class Solution {
    26     /**
    27      * @param nums: A list of integers
    28      * @return: A list of integers includes the index of the first number 
    29      *          and the index of the last number
    30      */
    31      
    32     public int[] subarraySumClosest(int[] nums) {
    33         // write your code here
    34         int[] res = new int[2];
    35         Element[] sums = new Element[nums.length+1];
    36         sums[0] = new Element(-1, 0);
    37         int sum = 0;
    38         for (int i=0; i<nums.length; i++) {
    39             sum += nums[i];
    40             sums[i+1] = new Element(i, sum);
    41         }
    42         Arrays.sort(sums);
    43         int minDif = Integer.MAX_VALUE;
    44         for (int i=1; i<sums.length; i++) {
    45             int dif = sums[i].getValue() - sums[i-1].getValue();
    46             if (dif < minDif) {
    47                 minDif = dif;
    48                 res[0] = Math.min(sums[i].getIndex(), sums[i-1].getIndex()) + 1;
    49                 res[1] = Math.max(sums[i].getIndex(), sums[i-1].getIndex());
    50             }
    51         }
    52         return res;
    53     }
    54 }
  • 相关阅读:
    Tomcat 启动很慢?
    CentOS 下 安装 JDK8
    CentOS 下 安装 nginx
    SpringBoot 之 打war包
    Spring MVC处理异常有3种方法
    springboot 之 使用jetty web容器
    IDEA 中,编译后不拷贝 mybatis 配置的 mapper 的 xml 文件
    js 鼠标点击页面出现文字
    PHP 获取天气
    js 必须为字母或下划线, 一旦创建不能修改
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5101798.html
Copyright © 2011-2022 走看看