给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
第一种:暴力法
import java.util.Scanner;
public class Demo4 {
// 1 2 6 34 5 6 9
/*
* 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 输入:
* [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
int nums[] = {11,11};
int maxSum = maxSumArray(nums);
System.out.println("最大和为" + maxSum);
}
private static int maxSumArray(int[] nums) {
// TODO 自动生成的方法存根
if (nums.length == 0 || nums == null) {
return 0;
}
if (nums.length == 1) {
return nums[0];
}
int max = nums[0];
int maxsum = 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 (sum > max) {
max = sum;
}
}
if (max > maxsum) {
maxsum = max;
}
}
return maxsum;
}
}
第二种:和第一种思想差不多
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length == 0) {
return 0;
}
int curMax = nums[0];
int allMax = nums[0];
for(int i = 1; i < nums.length; i++) {
curMax = Math.max(nums[i], curMax + nums[i]);
allMax = Math.max(allMax, curMax);
}
return allMax;
}
}
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i=m-1,j=n-1;
int index=m+n-1;
while(index>=0){
//前两个判断要放在前面,防止空指针异常
if(i<0){
nums1[index--]=nums2[j--];
}else if(j<0){
nums1[index--]=nums1[i--];
}
else if(nums1[i]>nums2[j] && i>=0){
nums1[index--]=nums1[i--];
}else if(nums1[i]<=nums2[j]&& j>=0){
nums1[index--]=nums2[j--];
}
}
}
}