首页 > 其他分享 >lintcode:Subarray Sum Closest

lintcode:Subarray Sum Closest

时间:2022-12-01 18:32:37浏览次数:37  
标签:index nums int lintcode Sum sums vector res Subarray


Given an integer array, find a subarray with sum closest to zero. Return the indexes of the first number and last number.

Example
Given [-3, 1, 1, -3, 5], return [0, 2], [1, 3], [1, 1], [2, 2] or [0, 4].

Challenge
O(nlogn) time

这题个人感觉比较难;
思路:
1.求数组每一项的前缀和(包括该项);
2.对前缀和排序;
3.求差的绝对值最小的两个相邻前缀和项;

1.提交1

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
int len=nums.size();
vector<int> res(2);

if(len==1){
res[0]=0;
res[1]=0;
return res;
}

vector<int> sums(len);

sums[0]=nums[0];
for(int i=1;i<len;i++){
sums[i]=sums[i-1]+nums[i];

}

vector<int> new_sums=sums;

sort(new_sums.begin(),new_sums.end());

int min=INT_MAX;
// int min_id;
int index1,index2;
for(int i=1;i<len;i++){
int diff=abs(new_sums[i]-new_sums[i-1]);
if(diff<min){
min=diff;
//min_id=i;
for(int j=0;j<len;j++){
if(sums[j]==new_sums[i-1]){
index1=j;
}
if(sums[j]==new_sums[i]){
index2=j;
}
}
if(index2<index1){
swap(index1,index2);
}
index1++;
}
}

//int index1,index2;


res[0]=index1;
res[1]=index2;

return res;
}
};

大部分数据测试试正确的,单有少部分不行。个人觉得原因是有前缀和相同的项。

所以本题还有一个难点,就是既要求前缀和,又要保存其相应的索引

用map不行,可以使用pair,而且对pair我还有一个以前忽略的地方,含pair对象的vector可以直接排序,如

#include<iostream>
#include<algorithm>
#include<vector>
#include<utility>
using namespace std;

int main(){
vector<pair<int, int> >vec;
vec.push_back({3,1});
vec.push_back({2,2});
vec.push_back({1,3});

sort(vec.begin(),vec.end());

for (int i = 0; i < vec.size();i++){
cout << vec[i].first<<" "<<vec[i].second<<endl;
}


return 0;
}

lintcode:Subarray Sum Closest_i++


也就是对pair的first进行从小到大的排序。

AC代码:

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
int len=nums.size();
vector<int> res(2);

if(len==1){
res[0]=0;
res[1]=0;
return res;
}

vector<pair<int,int> > sums_index(len);

sums_index[0]={nums[0],0};
for(int i=1;i<len;i++){
sums_index[i].first=sums_index[i-1].first+nums[i];
sums_index[i].second=i;
}

sort(sums_index.begin(),sums_index.end());

int min_diff=INT_MAX;
int left,right;
for(int i=1;i<len;i++){
int diff=abs(sums_index[i].first-sums_index[i-1].first);
if(diff<min_diff){
min_diff=diff;
left=min(sums_index[i].second,sums_index[i-1].second)+1;
right=max(sums_index[i].second,sums_index[i-1].second);
}
}


res[0]=left;
res[1]=right;
return res;
}
};


标签:index,nums,int,lintcode,Sum,sums,vector,res,Subarray
From: https://blog.51cto.com/u_15899184/5903575

相关文章

  • lintcode: Sqrt(x)
    Implementintsqrt(intx).Computeandreturnthesquarerootofx.Examplesqrt(3)=1sqrt(4)=2sqrt(5)=2sqrt(10)=3ChallengeO(log(x))求非线性方程的解可以......
  • Lorem Ipsum
    Loremipsumdolorsitamet,consecteturadipiscingelit.Nullamegetnuncneclectusvenenatiseuismodatsedmetus.Pellentesqueeuorcisitametsemluctusd......
  • 【题解】ABC237G Row Column Sums 2(感谢强大 alpha!!1【3】)
    题意:求\(n\timesn\)方阵个数,满足每列之和为\(R_i\),每行之和为\(C_i\)。数据范围:\(0\leqR_i,C_i\leq2\),\(n\leq10^7\)。转二分图,相当于限定左侧每个点和右侧......
  • 1. Two Sum
    1.TwoSumGivenanarrayofintegersnums andanintegertarget,returnindicesofthetwonumberssuchthattheyadduptotarget.Youmayassumethateach......
  • SQL-runoob-function-sum
    mysql>SELECT*FROMaccess_log;+-----+---------+-------+------------+|aid|site_id|count|date|+-----+---------+-------+------------+|1|......
  • rabbitmq的consumer_timeout修改
    问题:项目中使用了rabbitmq来做异步任务,最近突然发现一个耗时比较长的任务一直在重复执行。排查:排查日志后发现了超时,channel关闭。如果超过了consumer_timeout时间默认......
  • 预告|2022 星策 Summit 首批嘉宾确认,精彩内容抢先看!
    StartTogether,StarTogether,一起开始,一起闪耀!星策社区年度最大峰会来啦!2022星策Summit是由星策开源社区主办、思否社区协办,面向企业管理层、CTO、CEO、AI工程师、开发......
  • Freesql ORM 多条件枚举Sum
    反射枚举desc建拉姆达查询sum///<summary>///创建lambda表达式:p=>p.propertyName///</summary>///<typeparamname="T"></ty......
  • SPOJLCMSUM - LCM Sum
    简要题意\(T\)组数据,每组数据给出一个\(n\),计算:\[\sum_{i=1}^{n}{\operatorname{lcm}(i,n)}\]\(1\leqT\leq3\times10^5,1\leqn\leq10^{6}\)思路比较快乐的......
  • Apache Pulsar 社区年度峰会 Pulsar Summit Asia 2022 即将召开
    关于 PulsarSummitPulsarSummit 是 ApachePulsar 社区年度盛会,它将分布在世界各地的 ApachePulsar 项目 Contributor、Committer 和各企业 CTO/CIO、开发者、......