LeetCode 贪心算法 376. 摆动序列

  1. 摆动序列
    题⽬链接:https://leetcode-cn.com/problems/wiggle-subsequence/
    如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第⼀个差(如果存在
    的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
    例如, [1,7,4,9,2,5] 是⼀个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反,
    [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第⼀个序列是因为它的前两个差值都是正数,第⼆个序列是因
    为它的最后⼀个差值为零。
    给定⼀个整数序列,返回作为摆动序列的最⻓⼦序列的⻓度。 通过从原始序列中删除⼀些(也可以不删
    除)元素来获得⼦序列,剩下的元素保持其原始顺序。
    示例 1:
    输⼊: [1,7,4,9,2,5]
    输出: 6
    解释: 整个序列均为摆动序列。
    class Solution {
    public:
    int findContentChildren(vector& g, vector& s) {
    sort(g.begin(),g.end());
    sort(s.begin(),s.end());
    int index = 0;
    for(int i = 0;i < s.size();++i){
    if(index < g.size() && g[index] <= s[i]){
    index++;
    }
    }
    return index;
    }
    };
    示例 2:
    输⼊: [1,17,5,10,13,15,10,5,16,8]
    输出: 7
    解释: 这个序列包含⼏个⻓度为 7 摆动序列,其中⼀个可为[1,17,10,13,10,16,8]。
    示例 3:
    输⼊: [1,2,3,4,5,6,7,8,9]
    输出: 2

第一眼:什么玩意儿,开摆……
然后:先把距离数组搞出来,序列长度等于最终的距离数组+1
所以思路是这样的:
先看第一个不是0的距离是正还是负,打上flag,后面遍历,要求后一个的正负和前一个的flag不能相同,达到的话+1,根据距离数组可以得到数量至少是1(因为啥也不输入,或者距离数组放空的话一定是因为只输入了一个数或者几个相同的数)

LeetCode 贪心算法 376. 摆动序列_第1张图片
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
dis=[]
dis2=[]
count=1
flag=0
for i in range(0,len(nums)-1):
dis.append(nums[i+1]-nums[i])
for i in range(0,len(dis)):
if flag0:
if dis[i]>0:
flag=1
count=count+1
elif dis[i]<0:
flag=-1
count=count+1
else:
if dis[i]>0 and flag
-1:
count=count+1
flag=1
elif dis[i]<0 and flag==1:
count=count+1
flag=-1
return count

优化:反正是O(n),但是写的很拉

你可能感兴趣的:(leetcode,贪心算法,算法)