贪心

贪心即找最优解

1,分糖果

P455 easy
题目:
g=[5,10,2,9,15,9],s=[6,1,20,3,8],求最多满足几个孩子
思路:
排序糖果s,和孩子需求g,从小到大找,若小的能满足,继续g++,若不能满足s++,直到s<len(s) and g<len(g)

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
    s = sorted(s)
    g = sorted(g)
    i = j = 0
    while i<len(g) and j<len(s):
        if g[i] <= s[j]:
            i += 1
        j += 1
    return i

2,摇摆序列

P376 medium
题目:
nums=[1,7,4,9,2,5],相邻元素差:[6,-3,5,-7,3],正负交替。求满足这种序列的最长子序列长度
思路:
找最值,先定义一个初始值begin=0,找出比他大的则为up=1,小则为down=2,存到map中,每找一个值与前一个进行比较,直到找到最后
d366fc89b33b5786c9d49bd1b4139e8d.png
题解1:

class Solution(object):
    def wiggleMaxLength(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums)<2:
            return len(nums)

        state = {'begin':0,'up':1,'down':2}
        max_length = 1
        cc = state.get('begin')
        for i in range(1,len(nums),1):
            if cc == 0:
                if nums[i] > nums[i-1]:
                    cc = state.get('up')
                    max_length += 1
                elif nums[i] < nums[i - 1]:
                    cc = state.get('down')
                    max_length += 1
            elif cc == 1:
                if nums[i] < nums[i-1]:
                    cc = state.get('down')
                    max_length += 1
            elif cc == 2:
                if nums[i] > nums[i-1]:
                    cc = state.get('up')
                    max_length += 1
        return max_length

题解2:

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        n, c, res = len(nums), 0, 1 
        if n < 2:
            return n
        for i in range(1, n):
            x = nums[i] - nums[i - 1]
            # 如果有差值才继续处理,相等直接就跳过不处理了
            if x:
                # <0代表有上升下降的交替,=0是初始情况的判断
                if x * c <= 0:
                    res += 1
                c = x
        return res

3,移除K个数字

P402 medium
题目:
num = "1432219" k=3,去掉k个数字,找出最小的
思路:
定义一个栈,存储更小的数。特殊情况:12345这种,直接删队尾,有0的情况,直接append
??未掌握??

class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        length = len(num)
        if length == k:
            return '0'
        ll = [num[0]]
        for i in range(1,length):
            while ll and num[i] < ll[-1] and k > 0:
                ll.pop()
                k -= 1
            if num[i] != '0' or ll:
                ll.append(num[i])
        while ll and k > 0:
            ll.pop()
            k -= 1
        if not ll:
            ll = ['0']
        return ''.join(ll)

4,跳跃游戏

P55 medium
题目:
num=[2,3,1,1,4],可以跳num[i]次,判断是否可以跳到最后
思路:
定义可以跳跃的index数组index=[num[i]+i],jump从0开始,跳到len(num),找出index内最大的,

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        index_list = []
        for i in range(len(nums)):
            index_list.append(nums[i]+i)
        jump = 0
        index = index_list[0]
        while jump < len(index_list) and jump<=index:
            if index<index_list[jump]:
                index = index_list[jump]
            jump += 1
        if jump == len(index_list):
            return True
        return False

5,射击气球

P452 medium
题目:
points = [[1,2],[2,3],[3,4],[4,5]],输出2
660d4b9c92cc11ff0ae7be0c096a4b37.png
思路:
先排序points,然后找交点,若没有了,则新增一个
df450328d2863198822c9d0727126555.png

6,买卖股票

P122 easy
同2-摇摆序列

posted @ 2021-04-11 16:03  狂想曲°  阅读(64)  评论(0)    收藏  举报