程序员面试题精选(43):数组中连续元素相加和最小的元素序列
2007-12-05 21:40
387 查看
题目描述: 有一个集合{14,56,53,4,-9,34,...n}里面共n个数
里面可以有负数也可以没有
用一个时间复杂度为o(n)的算法找出其中的一个连续串象(53,4,-9) 这样(串里的数字个数任意)
使得这个连续串为所有这样连续串里各个数字相加和最小的一个
代码实现如下(程序没有考虑有多组解的情况)
#include <iostream>
using namespace std;
template<typename T>
int getMinSum(T* a,int n,T* pbegin,T* pend)
{
T min = a[0];
T sum = a[0];
T tempbegin = 0;
*pbegin = 0;
*pend = 0;
for (int i = 1; i < n; i++)
{
if(sum < 0)
sum = sum + a[i];
else
{
tempbegin = i;
sum = a[i];
}
if (sum < min)
{
min = sum;
*pbegin = tempbegin;
*pend = i;
}
}
return min;
}
int main()
{
int a[] = {8, 9, -3 ,-10 ,7 ,0 ,8 ,-12, 9, 8 ,-1 ,-2 ,9};
int begin;
int end;
int sum;
int k = sizeof(a) / sizeof(int);
sum=getMinSum(a,k,&begin,&end);
cout<<"The min sum is "<<sum<<endl;
cout<<"And the begin is "<<begin<<",and the end is "<<end<<endl;
return 0;
}
里面可以有负数也可以没有
用一个时间复杂度为o(n)的算法找出其中的一个连续串象(53,4,-9) 这样(串里的数字个数任意)
使得这个连续串为所有这样连续串里各个数字相加和最小的一个
代码实现如下(程序没有考虑有多组解的情况)
#include <iostream>
using namespace std;
template<typename T>
int getMinSum(T* a,int n,T* pbegin,T* pend)
{
T min = a[0];
T sum = a[0];
T tempbegin = 0;
*pbegin = 0;
*pend = 0;
for (int i = 1; i < n; i++)
{
if(sum < 0)
sum = sum + a[i];
else
{
tempbegin = i;
sum = a[i];
}
if (sum < min)
{
min = sum;
*pbegin = tempbegin;
*pend = i;
}
}
return min;
}
int main()
{
int a[] = {8, 9, -3 ,-10 ,7 ,0 ,8 ,-12, 9, 8 ,-1 ,-2 ,9};
int begin;
int end;
int sum;
int k = sizeof(a) / sizeof(int);
sum=getMinSum(a,k,&begin,&end);
cout<<"The min sum is "<<sum<<endl;
cout<<"And the begin is "<<begin<<",and the end is "<<end<<endl;
return 0;
}
相关文章推荐
- 算法题:找出一个数组中相加值最大的连续序列元素
- 程序员面试题精选100题(42)-旋转数组的最小元素[算法]
- 一个无序整数数组中找到最长连续序列(Longest Consecutive Sequence)和两个元素使得相差最小
- 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。
- 程序员面试题精选100题(42)-旋转数组的最小元素
- 程序员面试题精选(5):查找最小的k个元素
- 找出数组连续元素相加的最大和
- 程序员面试题精选100题(41)-把数组排成最小的数[算法]
- 对于一个数组{1,2,3}它的子数组有{1,2},{1,3}{2,3},{1,2,3},元素之间可以不是连续的,对于数组{5,9,1,7,2,6,3,8,10,4},升序子序列有多少个?
- 获取一个数组中最长的连续的元素序列
- 程序员面试题精选100题(41)-把数组排成最小的数
- LeetCode 16. 3Sum Closest--寻找数组中的三个元素和,该和与给定的值的差最小,输出这个和(三个元素可以不连续)
- 获取一个数组中最长的连续的元素序列。例如,给定了[31,6,32,1,3,2],最长的连续的元素序列是[1,2,3],返回其长度3
- 程序员面试100题之四十二,旋转数组的最小元素
- 程序员面试题精选100题(42)-旋转数组的最小元素
- 程序员面试题精选100题(42)-旋转数组的最小元素
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 程序员面试题精选100题(26)-和为n连续正数序列[算法]
- 通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小(两数组的差最小)。
- 程序员面试题精选(36):找出数组中唯一的重复元素