LintCode-最接近零的子数组和

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

样例

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

挑战

O(nlogn)的时间复杂度

分析:首先O(n^2)的算法很好想,直接枚举起点就行,看到挑战的复杂度,想肯定要排序或者二分什么的,这里没找出能二分的性质来,所以想只能想排序了,我们知道连续数组的和其实就是前缀和之间的差,而要求和最接近于零,也就是说,两个前缀和要最接近,那么直接前缀和排序,相邻两项比较即可

代码:

class Solution {
public:
    /**
     * @param nums: A list of integers
     * @return: A list of integers includes the index of the first number
     *          and the index of the last number
     */
    vector<int> subarraySumClosest(vector<int> nums){
        // write your code here
        vector<pair<int,int> > sum;
        int temp = 0;
        sum.push_back(make_pair(temp,-1));
        for(int i=0;i<nums.size();i++)
        {
            temp+=nums[i];
            sum.push_back(make_pair(temp,i));
        }
        sort(sum.begin(),sum.end());
        int start,end;
        int diff = INT_MAX;
        for(int i=1;i<sum.size();i++)
        {
            if(abs(sum[i].first-sum[i-1].first)<=diff)
            {
                diff = abs(sum[i].first-sum[i-1].first);
                start = min(sum[i].second,sum[i-1].second)+1;
                end = max(sum[i].second,sum[i-1].second);
            }
        }
        vector<int> ret;
        ret.push_back(start);
        ret.push_back(end);
        return ret;
    }
};
时间: 2024-10-12 08:57:42

LintCode-最接近零的子数组和的相关文章

算法练习——和最接近于零的子数组

问题描述: 求对于长度为N的数组A,求子数组的和接近0的子数组,要求时间复杂度O(NlogN) (1) 求出所有的sum[i]  sum[i]表示A的前 i 项和 (2) 对sum[-1,0,...,N-1]排序,然后计算sum相邻元素的差的绝对值,最小记为 min1   (3) min1 : 在A中任意取两个相邻子数组的和,求两者差的最小值.(相当于 i--j和的最小值)(4) min2 : A的前k个元素的和的绝对值的最小值(为sum[0,1....n-1]中的最小值)(5) min1和mi

(算法)和为0的最大连续子数组

题目: 和为零的最大连续子数组 思路: 我首先想到的是前缀数组和,遍历一遍数组,计算出sum[i](表示从0-i的子数组之和). 有了前缀数组和,只要sum[i]=sum[j](i<j),那么区间[i+1,j]就是和为零的子数组,只要在遍历前缀数组和时记录最长的区间即可. 需要注意的是:当sum[i]等于0时,其区间为[0,i]. 在判断sum[i]=sum[j](i<j)时,有个查找的过程,要么直接遍历j左边的所有数(增加时间复杂度),要么通过map来存储对应和的下标位置(空间换时间).(详

子数组和最接近零问题

子数组和最接近零问题: 对于长度为N的数组A,求连续子数组的和最接近0的值. 如:1,-2,3,10,-4,7,2,-5:该数组中子数组和最接近零的值为0,子数组为-4,7,2,-5. 程序实现: 1 /*************************************** 2 FileName NearZeroSubArray.cpp 3 Author : godfrey 4 CreatedTime : 2016/5/3 5 ******************************

数组中 最大和 的子数组

题目: 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n). 例如: 输入的数组为1, -2, 3, 10, -4, 7, 2, -5,最大和的连续子数组为3, 10, -4, 7, 2,其最大和为18. 背景: 本题最初为2005年浙江大学计算机系考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都把本题当作面试题. 由于本题在网络中广为流传,本题也顺利成为2006年程序员面试题中经典中的经典. 分析: 如果不考

算法学习笔记:最大连续子数组

寻找最大连续子数组 这两天看了看数据结构与算法,对其中一个问题颇感兴趣,所以在这里写一下.问题:寻找最大连续子数组. 问题:在一个有正有负的数组中,寻找一个连续的.和最大的子数组.这个数组类似于下面的数组,否则这个问题没有意义(如果全是正数的话,所有数组元素的和一定是最大的,同样全为负数也没有意义.). int a={1,-2,3,45,-78,34,-2,6}; 解法一:暴力求解. 那么如何来解决这个问题呢?这个思路要起来并不难,绝大多数人会想到这样的办法:遍历该数组的所有子数组,找到和最大的

Leetcode523. 连续的子数组和

链接:https://leetcode-cn.com/problems/continuous-subarray-sum 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例 1: 输入: [23,2,4,6,7], k = 6输出: True解释: [2,4] 是一个大小为 2 的子数组,并且和为 6.示例 2: 输入: [23,2,6,4,7], k = 6输出: Tru

找出一个整数数组的和最大的连续子数组

题目: 给任意一个整数数组,找出这个数组的和最大的连续子数组(子数组的和最大且子数组连续).要求:算法的时间复杂度为O(n). 程序设计思想: 1:用maxValue记录当前连续子数组和为最大的和的值,初始化其值为:maxValue=a[0].注:记数组为a[n]. 2:这个过程总的思想就是,从数组头开始往后,每次加进一个值,它们的和记为tempValue,若tempValue比新加进来的数值本身要小,应该从这个位置开始重新开始计算tempValue的值.而每次的tempValue都应该和max

最长可整合子数组

可整合子数组:按由小到大排完序之后,后面的数比前一个数大1,如:[2,4,3,6,5]就是可整合数组. 1 // getLiL.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <hash_set> 7 #include <iterator> 8 #include <set> 9 10 using namespace std

求一个数组中和最小的连续子数组

#include<stdio.h> #define MAX_LENGTH 10 int main() { int a[MAX_LENGTH]={1,2,3,-2,4,-6,-8,5,3,1}; int i,j,beg,end,tmp,min=0x7fffffff; //beg和end分别为子数组中首末元素下标,min为无穷大的数 beg=end=tmp=0; for(i=0;i<MAX_LENGTH;++i) { tmp=a[i]; for(j=i+1;j<MAX_LENGTH;+