和车神哥一起刷力扣leetcode|两数之和+打家劫舍 原创

府学路18号车神
发布于 2022-1-17 22:05
浏览
0收藏

春节不停更,此文正在参加「星光计划-春节更帖活动」https://harmonyos.51cto.com/posts/9923


每天进步一点点,就已经很棒很棒了,坚持坚持,不要太累,拒绝内卷,从每日一练开始,每天十分钟,快乐生活一辈子!

疫情依旧反复,大家带好口罩啊~

来,今天和车神哥一起来提升自己的Python编程和面试能力吧,刷天梯~

我的<font size=4 color=#FF0000>天梯积分规则</font>:

每日至少一题:一题积分+10分
若多做了一题(或多一种方法解答),则当日积分20分+10+10)
若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=;做了四道题则积分–10+10+20+20=60)


初始分为100分
若差一天没做题,则扣积分-10分(周六、周日除外注:休息
坚持!!!


题一

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例3:

输入:nums = [3,3], target = 6
输出:[0,1]


遍历暴力求解

分析:

从数组nums中提取出两个数,之和为target的值,那么说就不会存在相同的多个数会是的和为target,我们先用最能想到的遍历相加判断求解。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        re = []
        for i in range(n):
            for j in range(i+1, n):
                if nums[i]+nums[j] == target:
                    return [i,j]

枚举逆向求解

分析:

我们利用字典可以枚举数组,得到其数值和索引号,然后再由target减去当前值,得到的值判断是否存在于数组中

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
	records = dict()
	        for idx , val in enumerate(nums):
	            if target - val not in records:
	                records[val] = idx
	            else:
	                return [records[target - val], idx]

哈希

分析:

也是创建一个字典,然后枚举输出

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
	hashmap={}
	        for ind,num in enumerate(nums):
	            hashmap[num] = ind
	        for i,num in enumerate(nums):
	            j = hashmap.get(target - num)
	            if j is not None and i!=j:
	                return [i,j]

题二

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。


动态规划

分析:

目的是为了获得最高金额,但是不能连续偷两家,所以就两两进行选择,选择最大的,然后再跳过一家,在下面两家的中选取最大,这样,到最后就能获得最大的利益。

class Solution:
    def rob(self, nums: List[int]) -> int:
        a=b=0
        for x in nums:
            a, b = max(a, b), a + x
        return max(a, b)

愿所有人在2022能够找到属于自己的未来!!!加油

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2022-1-19 10:44:37修改
2
收藏
回复
举报
回复
    相关推荐