1、连续数列
//给定一个整数数组,找出总和最大的连续数列,并返回总和。 // // 示例: // // 输入: [-2,1,-3,4,-1,2,1,-5,4] //输出: 6 //解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 // // // 进阶: // // 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。 // Related Topics 数组 分治算法 动态规划
这一题如果直接采用遍历的方式来做,时间复杂度和空间复杂度都会特别大。所以有两种解法,一种是贪心算法,即如果我们前面的数与我们当前的数之和比我们当前的数要小,那么我们就放弃前面,直接从当前的数重新开始计算。每次在将当前数和当前最大数进行比较,然后给最大数重新赋值。
public int maxSubArray(int[] nums) {
//2、贪心算法
if(nums.length == 1){
return nums[0];
}
int cur_num = nums[0];
int max_num = nums[0];
for (int i = 1; i < nums.length; i++) {
cur_num = Math.max(nums[i], cur_num+nums[i]);
max_num = Math.max(max_num, cur_num);
}
return max_num;
}
还有一种是动态规划,如果前面的数之和大于0,就加上我们当前的数并放在数组中当前数的位置,这样就能获得一个新的数组,求数组中的最大值即可。
public int maxSubArray(int[] nums) {
//3、动态规划
for (int i = 1; i < nums.length; i++) {
if(nums[i-1]>0){
nums[i] += nums[i-1];
}
}
Arrays.sort(nums);
return nums[nums.length-1];
}
2、合并排列的数组
//给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。 // // 初始化 A 和 B 的元素数量分别为 m 和 n。 // // 示例: // // 输入: //A = [1,2,3,0,0,0], m = 3 //B = [2,5,6], n = 3 // //输出: [1,2,2,3,5,6] // // 说明: // // // A.length == n + m // // Related Topics 数组 双指针
这个应当从后往前来进行排列,因为A数组后面的几位都是0,所以即使把B数组全部都给填充进去,也对A中原先有意义的数没有什么影响,所以从后往前不用考虑A数组的平移,数据也不会丢失,直接赋值即可。
public void merge(int[] A, int m, int[] B, int n) {
int k = m+n-1,i=m-1,j=n-1;
while(i>=0&&j>=0) {
if (A[i]<B[j]) {
A[k--]=B[j--];
}else {
A[k--]=A[i--];
}
}
while(j>=0) A[k--]=B[j--];
}