LeetCode108--连续数列、合并排列的数组

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--];
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值