leetcode 考试整理

今天参加了leetcode第159contest考试,做出来两道题。只做出来了第一,二道题。第三题题目没有太懂。第四道题是dp问题,很是薄弱。

第一道题是判断给的点是不是在一条线上。很明显,就是判断斜率是否一致就可以了。但是要当心分母为0的情况。第二道题是路径包含的问题。比如/a/b /a/b/c /a 这三个最后的结果就是/a, 这里我采用的是先按/的多少进行排序,然后依次取出每一个,根据斜杠的个数进行循环,如果最终的结果里面都不包含,就放入,如果包含就pass, break出来。

第三道题给一个字符串,只包含’Q’, ‘W’, ‘E’ and ‘R’. 这里需要得到一个平衡的字符串,每一个字符串的数量都得是一样的,需要找一个子字符串,这个子字符串替换整个字符串的一部分之后使得字符串成为一个平衡的字符串。 做题思路是采用滑动窗口。

    def balancedString(self, s):
        count = collections.Counter(s)
        res = n = len(s)
        i = 0
        for j, c in enumerate(s):
            count[c] -= 1
            while i < n and all(n / 4 >= count[c] for c in 'QWER'):
             	# 
                res = min(res, j - i + 1)
                count[s[i]] += 1
                i += 1
        return res

第四道题是dp问题。这道题后来看了lee的答案,感觉太不可思议,就专门整理一下。
这道题主要是给你一个开始时间的列表,一个结束时间的列表,还有做工作的收益列表。你需要根据开始时间,结束时间,挑选出不冲突的时间段来获取最大的收益。

import bisect
class Solution:
    def jobScheduling(self, startTime, endTime, profit):
        jobs = sorted(zip(startTime, endTime, profit), key=lambda v: v[1])
        dp = [[0, 0]]
        for s, e, p in jobs:
            # 用开始时间判断应该插入的位置,用结束时间进行插入。
            i = bisect.bisect(dp, [s + 1]) - 1
            # 这样能拿到插入后的位置的左侧,判断当前的dp加上现在的p是否大于当前的最大值,如果大于的话,对dp进行插入操作。
            # 插入的时候要插入结束的时间,可用的最大job时间。
            # 不断的这样循环,返回最后的一个值的最后一位即为结果。
            if dp[i][1] + p > dp[-1][1]:
                dp.append([e, dp[i][1] + p])
        return dp[-1][1]

startTime = [1,2,3,3]; endTime = [3,4,5,6]; profit = [50,60,40,70]
target = 120
m = Solution().jobScheduling(startTime, endTime, profit)
print(m)
发布了199 篇原创文章 · 获赞 62 · 访问量 21万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览