leetcode:(53)最大子序和

  • (53)最大子序和
给定一个整数数组 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;
    }
}
  • (88)合并两个有序数组
给定两个有序整数数组 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--];
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值