动态规划:摇摆子数组

1人阅读 评论(0) 收藏 举报
分类:

    给定一个数组,求其最长摇摆子数组的长度。

    摇摆数组:数组的元素关系按照递增、递减、递增、递减...规律变化的数组,如[1,3,2,5,4]。

    数组的摇摆子数组:删除某些元素后,剩下的元素按照原来的顺序组成摇摆数组。如数组[1,17,5,10,13,15,10,5,16,8],删除部分元素后得到的其中一个最长摇摆子数组为[1,17,10,13,10,16,8],其长度为7。

    方法一:对每一个元素,找出把其当做较小的元素和较大的元素时,摇摆子数组的最长长度。这种方法需要两层遍历,时间复杂度为O(n^2)。

    public int wiggleMaxLength(int[] nums) {
        int[] l1 = new int[nums.length]; // as positive
        int[] l2 = new int[nums.length]; //as negative
        l1[0] = 1; l2[0] = 1;
        int maxLength = 1;
        for(int i = 1; i < nums.length; i++) {
	        	int max = 0;
        		for(int j = i - 1; j >= 0; j--) {
        			if(nums[j] < nums[i] && l2[j] > max) { //i is positive
        				max = l2[j];
        			}
        		}
    			l1[i] = Math.max(1, max + 1);
    			max = 0;
        		for(int j = i - 1; j >= 0; j--) {
        			if(nums[j] > nums[i] && l1[j] > max) { //i is positive
        				max = l1[j];
        			}
        		}
    			l2[i] = Math.max(1, max + 1);
        		maxLength = Math.max(maxLength,  Math.max(l1[i], l2[i]));
        }
        return maxLength;
    }

    方法二:对于每一个元素,如果下一步需要的是较小的元素,那么如果下一个元素比当前元素小,则考虑下一个元素,并开始寻找较大的元素;如果下一个元素比当前元素大,则把下一个元素替代当前元素(因为n[i+1] > n[i],寻找较小元素会比较容易)。该方法只需要一次遍历,时间复杂度为O(n)。

public int wiggleMaxLength(int[] nums) {
        if (nums.length == 0 || nums.length == 1) {
            return nums.length;
        }
        int k = 0;
        while (k < nums.length - 1 && nums[k] == nums[k + 1]) {  //Skips all the same numbers from series beginning eg 5, 5, 5, 1
            k++;
        }
        if (k == nums.length - 1) {
            return 1;
        }
        int result = 2;     // This will track the result of result array
        boolean smallReq = nums[k] < nums[k + 1];       //To check series starting pattern
        for (int i = k + 1; i < nums.length - 1; i++) {
            if (smallReq && nums[i + 1] < nums[i]) {
                nums[result] = nums[i + 1];
                result++;
                smallReq = !smallReq;    //Toggle the requirement from small to big number
            } else {
                if (!smallReq && nums[i + 1] > nums[i]) {
                    nums[result] = nums[i + 1];
                    result++;
                    smallReq = !smallReq;    //Toggle the requirement from big to small number
                }
            }
        }
        return result;
    }

查看评论

2018软考--网络规划设计师【综合知识】视频精讲

-
  • 1970年01月01日 08:00

【剑指 offer】(31)—— 连续子数组的最大和(动态规划)

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)O(n)。 例如,输入的数组为 {1, -2, 3, 10,...
  • lanchunhui
  • lanchunhui
  • 2016-04-07 16:25:58
  • 575

最大子数组之和(动态规划)

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。 看到这个题目,我们首先想到的是求出这个整型数组所...
  • bokzmm
  • bokzmm
  • 2015-09-17 17:58:18
  • 2336

连续子数组的最大和 动态规划实现

/* *copyright@nciaebupt 转载请注明出处 *问题:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。 *求所有子数组的和的最大值。要求时间负责度为...
  • wuwuwuwuwuwuwuwu
  • wuwuwuwuwuwuwuwu
  • 2013-01-08 16:51:42
  • 2693

动态规划典型例题--连续子数组的最大和

题目描述:给定一个数组arr,数组中的元素有整数也有负数,数组中的一个或者连续多个数组成一个子数组。 求所有子数组里面的最大和。例如现在有数组 {1 , -2 , 3 , 10 , -4 , 7...
  • qq_34528297
  • qq_34528297
  • 2017-05-24 19:27:09
  • 3385

动态规划——最大子数组

上一篇我们用分治法已经将问题的复杂度降低了许多,但是,我们依旧不满足,于是,我们尝试用动态规划来做这道题。解题思路: 对于这样一个连续和的问题(个人习惯叫做最大连续和),如果我们要用动态规划来解,首...
  • fuyukai
  • fuyukai
  • 2015-03-11 22:42:39
  • 1013

【动态规划】求一维子数组的最大和

题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如,输入的数组为1, -2, 3...
  • z702143700
  • z702143700
  • 2015-09-30 20:43:39
  • 727

《算法导论》学习笔记——最大子数组(分治策略,动态规划)

一、分治策略 分治法的思想     将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。 递归式     递归式与分治方法是紧密相关的,因...
  • chensilly8888
  • chensilly8888
  • 2015-01-04 10:42:51
  • 1304

最大子数组问题(动态规划)--【算法导论】

《算法导论》中引入这个问题是通过股票的购买与出售,将前一天的当天的股票差价重新表示出来,即转为了一个最大子数组的问题,具体内容我不多说,转的内容是: 13, -3, -25, 20, -3, -16...
  • xjm199
  • xjm199
  • 2014-01-07 10:32:01
  • 5137

剑指offer----连续子数组的最大和----java实现

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数...
  • snow_7
  • snow_7
  • 2016-07-17 23:52:06
  • 809
    个人资料
    持之以恒
    等级:
    访问量: 1295
    积分: 813
    排名: 6万+
    文章存档