摘要:
回溯法 思路: 参考39.组合总和,在回溯时加判断条件和改变开始位置达到去重。 代码: class Solution: def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: candidat 阅读全文
摘要:
回溯法 思路: ①先对给定数组排序 ②从头遍历数组的每一个值,当这个值小于target时,压入数组pathList,target减去当前值,继续从数组当前值的位置开始遍历(这里涉及到对数组进行剪枝处理,为了去重),当target为0时,将数组pathList压入数组res,遍历结束后返回res 例如 阅读全文
摘要:
双指针 思路: 一个指针负责遍历,另一个指针负责记录,遇到不同值时更新状态。 class Solution: def countAndSay(self, n: int) -> str: def getResult(para:str)->str: record = para[len(para)-1] 阅读全文
摘要:
回溯法 思路: ①首先建立三个数组,分别记录每行每列和每个3x3宫内出现过的数字,从第0行第0列开始进行② ②如果遇到的字符不是' . ',则进行填入下一个值操作。如果遇到字符是' . '则填数字,可以填入数字范围为1-9,每填入一个数字需要进行判断,如果这个数字在对应所在行、列、和3x3宫内出现过 阅读全文
摘要:
一次遍历 思路: 对二维数组每个元素进行遍历,遍历的同时记录下当前元素在行、列和3x3格中出现的次数,如果大于1返回False,遍历结束则返回True。 代码: class Solution: def isValidSudoku(self, board: List[List[str]]) -> bo 阅读全文
摘要:
二分法 代码: class Solution: def searchInsert(self, nums: List[int], target: int) -> int: if not nums: return 0 l,r = 0,len(nums)-1 while l <= r: mid = (l+ 阅读全文
摘要:
二分法: 思路: 先用二分法找到左边界,再用二分法找到右边界。 class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: if not nums: return [-1,-1] def sear 阅读全文
摘要:
二分法: 思路: 取要选择区间的中间位置,则在中间位置左边或者右边必然有一个有序数组,我们可以在通过判断target是否在有序数组来查找target位置并更新mid的值。 例如: nums = [4,5,6,7,0,1,2] target = 0 l = 0 , r = 6 , mid = 3 , 阅读全文
摘要:
动态规划 思路: 从头开始遍历字符串,当遇到左括号时,dp[i] = 0,当遇到右括号时开始分情况讨论: ①如果s[i-1]为左括号时,则dp[i] = dp[i-2] + 2 (这里要注意数组越界的问题,把i<2的情况单独拿出来) ②如果s[i-1]为右括号时,并且s[i-dp[i-1]-1]为左 阅读全文
摘要:
扫描法 思路: 题目的意思是给定一个数组,按数组给的顺序拼接其中每个数字得到一个数字num,我们要做的是调换下数组中一些元素的位置,使新的数组按顺序排列后的数字num2,刚好是下一个比num大的数字。 例如:给定数组 [2,4,3,1],拼接后的数字是2431,用这四个数字能得到刚好比2431大的下 阅读全文