397. 整数替换

博客讨论了LeetCode题的解法,指出最初用列表解题会因大的数据爆内存,实际上本题无需列表或字典,用简单深搜即可。此外,评论区有一种更好的解法,根据奇数分为n+1和n - 1,以4分类找规律,无需搜索,节省时间和空间。

本题其实不需要用列表或者字典即可,只需要求一个数,浪费存储
最开始还很蠢用了列表,大的数据会爆内存
解法:一个简单深搜即可

在评论区看到一个更好的解法,因为奇数分为n+1和n-1,所以以4来分类,找规律,直接连搜索都不用,时间空间都很节省。

class Solution:
	def integerReplacement(self, n: int) -> int:
		dic = {}
		
		def dfs(num):
			if num == 1:
				dic[1] = 0
				return 0
			if num in dic.keys():
				return dic[num]
			if num % 2 == 0:
				dic[num] = dfs(int(num / 2)) + 1
			if num % 2 == 1:
				dic[num] = min(dfs(num + 1), dfs(num - 1)) + 1
			return dic[num]

		return dfs(n)

if __name__ == "__main__":
	print(Solution.integerReplacement("", 200000000))
### LeetCode 替换整数问题分析 在 LeetCode 平台上,“替换整数”的表述较为宽泛,可能涉及多种类型的题目。为了更好地理解这一类问题,可以考虑以下几个方面: #### 1. 数字操作与转换 对于某些特定的数字处理问题,比如将一个整数的每一位相乘再减去每位数字之和的操作,在 C++ 中可以通过取模运算 `%` 和除法 `/` 来实现对单个位数的操作[^1]。 ```cpp int subtractProductAndSum(int n) { int product = 1; int sum = 0; while (n != 0){ int digit = n % 10; product *= digit; sum += digit; n /= 10; } return product - sum; } ``` 此代码片段展示了如何计算给定整数 `n` 的各个位上的数值相乘的结果以及它们之间的差异。 #### 2. 特殊情况处理 当遇到像 10 或者 100 这样的特殊情况时(即最后一位是零),应当特别注意输出结果是否会受到影响或者是否有特殊的要求[^4]。通常情况下,如果只是简单地求解各位置上非零数字间的算术关系,则不会受到末尾零的影响;但如果涉及到其他逻辑判断,则需额外小心对待这类输入数据。 #### 3. 动态规划应用实例 另一个常见的主题是在一定条件下优化某个目标函数值的问题,例如整数拆分以达到最大乘积的情况。通过动态规划的方法可以在多项式时间内解决此类难题,并且能够有效地找到全局最优解[^3]。 ```python def integerBreak(n: int) -> int: dp = [0]*(n+1) for i in range(2,n+1): curMax = 0 for j in range(1,i//2+1): curMax=max(curMax,max(j*(i-j),j*dp[i-j])) dp[i]=curMax return dp[-1] ``` 上述 Python 实现利用了动态规划的思想来解决问题,其中 `dp[i]` 表示把正整数 `i` 拆分成若干部分后的最大乘积。 #### 4. 序列中的模式识别 还有一类问题是关于查找序列中存在的某种规律或子结构的存在性验证,如寻找是否存在三个严格递增元素构成三元组的情形。这同样属于广义上的“替换”概念之一——通过对原始列表进行适当调整从而满足新的条件约束[^2]。 ```java public class Solution { public boolean increasingTriplet(int[] nums) { int len = nums.length; if(len<3)return false; int numI = Integer.MAX_VALUE; int numJ = Integer.MAX_VALUE; for(int i=0;i<len;i++){ if(nums[i]<=numI)numI = nums[i]; else if(nums[i]<=numJ)numJ = nums[i]; else return true; } return false; } } ``` 这段 Java 代码实现了在一个数组中检测是否存在长度为 3 的上升子序列的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值