您的位置:首页 > 职场人生

面试中遇到的算法题(一)

2017-11-06 10:03 225 查看

求数组的子数组之和的最大值

比如 -5,3,-7,3,2,3,连续最大整数和为 3+2+3 = 8

算法1:穷举法

思路:记Sum[i,…,j]为数组第i个元素到第j个元素的和(其中0<=i<=j

Java代码如下

public int getMaxSum(int[] nums){
int max = nums[0];
for(int i = 0;i < nums.length;i++){

for(int j = i;j < nums.length;j++){
int sum = 0;
for(int k = i;k<=j;k++){
sum += nums[k];
}
if(max < sum)
max = sum;
}
}
return max;
}


算法2:穷举法的优化方法,如果注意到Sum[i,…,j] = Sum[i,…,j-1] + nums[j],则可将算法中的最后一个for循环省略,避免重复计算。时间复杂度为O(n2)代码如下:

public int getMaxSum(int[] nums){
int max = nums[0];
for(int i = 0;i < nums.length;i++){
int sum = 0;
for(int j = i;j < nums.length;j++){
sum += nums[j];
if(max < sum)
max = sum;
}
}
return max;
}


算法3:动态规划方法,时间复杂度O(n).Java代码如下:

public int getMaxSum(int[] nums){
int max = nums[0];
int sum = max;
for(int i = 0;i < nums.length;i++){
sum = Math.max(sum + nums[i],nums[i]);
max = Math.max(max,sum);
}
System.out.println(max);
return max;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 面试 java