ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

135 - 140

2022-01-15 19:35:30  阅读:225  来源: 互联网

标签:ratings 140 nums index random next num 135


135  分糖果  

一开始 用贪心算法 

就很简单的从头到尾遍历 , 对于一个数如果他
比前面数大: 就是前面那个糖果数加1
跟前面数相等: 就是1
比前面数小: 就是1
但是如果前面人的糖果也是1呢 就会出现分数不同但是糖果相同的情况,此时需要把前面的严格递减(只差1)分数全部加1
比如前面人糖果数是 ...10,3,2,1 那么 再来一个小的数 就需要把 3,2,1全部加1 变成 10,4,3,2 后面添上当前的1
注意相等情况就不用往前看了 。

举例: [0,1,2,3,2,1]
0位: 1颗糖
1位: 1比0大 2颗糖
2位: 2比1大 3颗糖
3位: 3比2大 4颗糖
4位: 2比3小 1颗糖
5位: 1比2小 1颗糖 但是4位也是1颗糖 找到一个严格递减的区间 只有4位。所以4位加1变成2
得结果[1,2,3,4,2,1]

 

def candy(ratings):
    n = len(ratings)
    if n == 1:
        return 1
    num = [1]*n
    for i in range(n):
        if ratings[i] > ratings[i-1]:
            num[i] = num[i-1] +1
        elif ratings[i] < ratings[i-1]:
            if num[i-1] == 1:
                for index in range(i-1,-1,-1):
                    if num[index] == num [index+1] and ratings[index] != ratings[index+1]:
                        num[index] += 1
                    else:
                        break
    return sum(num)


作者:yizhu-jia
链接:https://leetcode-cn.com/problems/candy/solution/liang-chong-fang-fa-xiang-xi-jie-xi-jia-x04aq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路2 : 

跟卖股票一样 卖股票是找到每一个上升的区间 这题是找到每一个上升的和每一个下降的区间 每个区间结尾是下个区间开头。
对于一个数 如果他
比后面数大:
存在一个递增的区间 。找出这个区间 从这个数字开始,这个区间赋予糖果 1,2,3,4,5
比后面数字小:
存在一个递减的区间。 找出这个区间 从这个数字开始,这个区间倒序赋予糖果 ...,3,2,1
但是此时需要注意一种特殊情况 因为递减区间的开头是上一个递增区间的结尾。 所以你不能让这个结尾变得更小,需要取一个MAX
跟后面数字一样:
跳过继续往后看就行。
因为代码会出现与i+1的比较 所以把最后一位单独考虑了 。

举例: [0,1,2,3,2,1]
0比1小 找到一个递增区间 0,1,2,3
赋予糖果 1,2,3,4
3比2大 找到一个递减区间 3,2,1
赋予糖果 3,2,1
但是第三个小朋友必须大于第二个小朋友的2个
所以取max[4,3]= 4
需要糖果就是[1,2,3,4,2,1]

 

 

class Solution:
    def candy(self, ratings: List[int]) -> int:
        n = len(ratings)
        if n == 1:
            return 1
        nums = [1]*n
        i = 0
        while i < n-1 :
            if ratings[i]> ratings[i+1]:
                index= i
                while  ratings[i]> ratings[i+1]:
                    i += 1
                    if i == n-1:
                        break
                for j in range(i-1,index,-1):
                    nums[j] = nums[j+1] +1
                nums[index] = max(nums[index],nums[index+1]+1)
            elif ratings[i] < ratings[i+1]:
                index= i
                while  ratings[i]< ratings[i+1]:
                    i += 1
                    if i == n-1:
                        break
                for j in range(index+1,i+1,1):
                    nums[j] = nums[j-1] +1
            elif ratings[i] == ratings[i+1]:
                i += 1
        if ratings[n-1] < ratings[n-2]:
            nums[n-1] = 1
        return sum(nums)

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/candy/solution/liang-chong-fang-fa-xiang-xi-jie-xi-jia-x04aq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

136  异或解法   这两道都是抄的 碰到进制就头痛

 

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        return reduce(lambda x,y:x^y,nums)


作者:yizhu-jia
链接:https://leetcode-cn.com/problems/single-number/solution/tong-yang-shi-ti-jie-wei-sha-wo-zhi-da-b-w0hz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

 

 

137:

出现1次的数字 

答案都看不懂了 

唉 

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        a = b = 0
        for num in nums:
            a, b = (~a & b & num) | (a & ~b & ~num), ~a & (b ^ num)
        return b


作者:yizhu-jia
链接:https://leetcode-cn.com/problems/single-number-ii/solution/kan-bu-dong-kan-bu-dong-kan-bu-dong-ai-b-5h01/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

138 再来克隆 这次是奇怪的链表 

 

p和r 一个代表原来 一个代表复制 一起往后遍历
next出现没见过的 就建立
random出现没见过的 先建立 next到他再说。
OK了

 

 

 

 

"""
# Definition for a Node.
class Node:
    def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
        self.val = int(x)
        self.next = next
        self.random = random
"""

class Solution:
    def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':
        if not head:
            return head
        nodedict = {}
        p = head
        chead = Node(x=p.val, next=None,random=None)
        nodedict[head] = chead
        r = chead
        while p.next != None:
            if p.next not in nodedict:
                chead = Node(x=p.next.val, next=None,random=None)
                nodedict[p.next] = chead
                r.next = chead
            else:
                r.next = nodedict[p.next]
            if p.random == None:
                r.random = None
            elif p.random not in nodedict:
                chead = Node(x=p.random.val, next=None,random=None)
                nodedict[p.random] = chead
                r.random = chead
            else:
                r.random = nodedict[p.random]
            p = p.next
            r = r.next
        if p.random:
            r.random = nodedict[p.random]
        return nodedict[head]

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/solution/zhe-chong-ti-gan-jue-zhi-yao-na-ge-zi-di-yri6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

139: 单词划分 


回溯是我的爱,超时让我没法爱

我知道是DP  但我毫无思路 

    n = len(s)
    dp = [False]*(n+1)
    dp[0] = True
    for i in range(n):
        for j in range(i+1):
            if dp[j] and (s[j:i+1] in wordset):
                dp[i+1] = True
                break
    return dp[n]

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/word-break/solution/hui-su-shi-wo-de-ai-chao-shi-rang-wo-mei-dytj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

140  单词划分2 

算路径还得我回溯来!!!

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
        wordset = set(wordDict)
        n = len(s)
        rel = []
        def dfs(start,path):
            for i in range(start+1,n+1):
                if s[start:i] in wordset:
                    path.append(s[start:i])
                    if i == n:
                        rel.append(' '.join(path[:]))
                    dfs(i,path)
                    path.pop()
        dfs(0,[])
        return rel

作者:yizhu-jia
链接:https://leetcode-cn.com/problems/word-break-ii/solution/ha-ha-ha-ha-ha-suan-neng-bu-neng-ni-dpli-o7t0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

标签:ratings,140,nums,index,random,next,num,135
来源: https://www.cnblogs.com/xiaoli1996/p/15807821.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有