每日一题(LeetCod 376 贪心)

摆动序列

贪心算法:顾名思义,贪就好了,就要当前可以选择的最好的最好的。

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列(我认为这个是非常重要的条件!!!),剩下的元素保持其原始顺序。

示例 1:

输入: [1,7,4,9,2,5]
输出: 6
解释: 整个序列均为摆动序列

示例 1:
输入: [1,7,4,9,2,5]
输出: 6
解释: 整个序列均为摆动序列

示例 2:
输入:[1,17,5,10,13,15,10,5,16,8]
输出:7
解释:这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。

题目转载自原题地址

这个题目是我从今天看的贪心算法的视频看到的一个题目,自己先做了一下,发现自己的思路考虑有些问题,终究还是思路不清晰。

老师给讲了一个这个办法,说是贪心算法的题目可以先试着把结果写出来,来看一看这个是否是适用的,是否是最优的。如果是,找一找所有最优解的共同点,我们便可以获取一个正确的解题思路

如下图所示:
图是示例2的解题图片。

这个图是示例2的解题图片
写出来了,我们便可以清楚的看出来,这道题的算法写的时候,我们只应该取定点的坐标,以来保证这个差值的最大性,来保持我们贪心算法的最优性。

为什么差值最大就是最优的呢?
在我看来不难想,当一个数后面有多个数可以选择的时候,比如说3节点时,后又有三个选择 10、13、15三个选择,不过当我们选择10的时候 那么如果说不存在8节点,我们的结果就会少两个。

这个题目有一种特殊的情况,一种是所有数都相等,结果为一。

代码如下:

int wiggleMaxLength(int* nums, int numsSize){
if(numsSize < 2)
    {
     return numsSize;
 }
 
 int i = 1; //当前的所指向的数
 int con = 0; //当前是上升状态(1),还是说是下降状态(2) 
 int length = 1; //可以的最大长度 

 while(i<numsSize)
 {
	  if(con == 0) 
	  {
		 if(nums[i]>nums[i-1])
		{
		    con = 2;
		    length++;
		}
		else if(nums[i]<nums[i-1])
		{
		    con = 1;
		    length++;
		}
	 }
	else if(con == 1)
	{
	         if(nums[i]>nums[i-1])
	  	{
	    		length++;
	   		con = 2;
	   	}
 	}
	else if(con == 2)
	{
		if(nums[i]<nums[i-1])
		{
		    length++;
		    con = 1;
		}
	 }
	  i++;
 }
 
 return length;
}

(今天再加一个小小的思考)
买东西,438元的东西,要求要用1、5、10、20、100、200元钞票购买,求最小用的张数。

200+200+20+10+5+1+1+1 = 438 8张

这个咱们可以很简单的用贪心的思想来思考出来,因为所有的钞票的数值都是前面钞票的倍数,所以可以这么做,但是当有7元钞票时,便不可这么做!!! 只能用动态规划
例如:14元物品,如果按照贪心算法,则应该是 10+7张1元 8张 ,但是 其实答案应该是 7*2 = 14 2张,所以,在用贪心算法前应好好思考!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值