废话不多说,直接开搞
一 移零问题
1.1题目说明
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
1.2 思路
由于题目要求不可以复制数组,所以采用移除添加的方法
1.对整个数组进行遍历
2.若遇到0则将其从原数组中移除,并对末尾补0
1.3 代码
class Solution: ##使用下标做引导会导致数字中间出现空档
def moveZeroes(self, nums):
n = len(nums)
for i in range(n):
if nums[i] == 0:
nums.append(0)
del nums[i-1]
return nums
if __name__ == "__main__":
leecode = Solution()
result = leecode.moveZeroes([0,0,1])
print(result)
在算法设计时,最开始采用了下标遍历的方式,这样会导致当移除数组时,原数组数据缩进,故错过以后0后顺位的数字,因而采用对直接对数组进行遍历
class Solution:
def moveZeroes(self, nums):
"""
Do not return anything, modify nums in-place instead.
"""
for i in nums:
if i == 0:
nums.append(0)
nums.remove(0)
print(nums)
if __name__ == "__main__":
leecode = Solution()
result = leecode.moveZeroes([0,0,1])
print(result)
1.4 补充
二 求众数
2.1 问题
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例:
输入: [3,2,3]
输出: 3
2.2 思路
通过python 字典对其进行遍历 以及出现次数的统计
和leecode刷题日记一的中想法基本一致
2.3 代码
class Solution:
def majorityElement(self, nums):
dict = {}
n = len(nums)
for num in nums:
dict[num] = dict.get(num,0) + 1
for key,val in dict.items():
print("key is "+str(key)+" val is "+str(val))
if val>(n/2):
return key
if __name__ == "__main__":
leecode = Solution()
result = leecode.majorityElement([2,2,1,1,1,2,2])
print(result)
其中,较为关键的一步为字典的构建,应该比较重要,key为遍历元素,val为出现次数,利用python dict.get()函数 获取其值得val ,若不存在即为0,并且再原基础上加1
2.4 补充
三 打家劫舍(今天刷到最喜欢的题)
3.1 问题
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例:
输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
3.2 思路
这以一种动态规划的经典题目,动态规划最重要的就是找到状态转移方程
由分析可知,其状态转移方程为 cur = max(cur , pre +nums[i])
其中,cur代表当前的最大值,pre代表上一次所取得的最大值 nums[i],代表遍历时本次需要判断的数值,利用python 的多元赋值功能,固有如下代码
cur ,pre = max(cur,pre+nums[i]),cur
3.3 源码
class Solution:
##中间限制题 通常建立动态规划,cur 代表当前可偷最大值 pre 代表上一次可偷最大值
##其动态规划建立为 cur = max(cur,pre + nums[i]) nums[i]代表新引入值
def rob(self, nums):
cur,pre = 0,0
for i in nums:
cur,pre = max(cur,pre+i),cur
return cur
if __name__ == "__main__":
leecode = Solution()
result = leecode.rob([1,2,3,1])
print(result)
3.4 补充
四 爬楼梯
4.1 问题
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
4.2 思路
这种类型也是典型的动态规划问题
这个问题,我们通过分析可知。要到第n个台阶所需要的次数 无非为两项求和,f(n-1) + f(n-2)这两项,由于题目限定每一次可以爬1或2个台阶,这样理解的话 问题就可迎刃而解
1.建立F 数组用于存放到各个台阶的方法数 并初始化为[1,2]
2.对输入n进行遍历,建立动态方程 f.append(f[i-1] + f[i-2])
3.输出f[n-1]的值,由于n是从0开始的。
4.3 源码
class Solution:
def climbStairs(self, n: int) -> int:
f = [1, 2]
for i in range(2, n):
f.append(f[i-1] + f[i-2])
return f[n-1]
leecode = Solution()
a = 4
result = leecode.climbStairs(a)
print(result)