diff --git "a/problems/0093.345円244円215円345円216円237円IP345円234円260円345円235円200円.md" "b/problems/0093.345円244円215円345円216円237円IP345円234円260円345円235円200円.md" index 3701420f31..55e57dde5f 100644 --- "a/problems/0093.345円244円215円345円216円237円IP345円234円260円345円235円200円.md" +++ "b/problems/0093.345円244円215円345円216円237円IP345円234円260円345円235円200円.md" @@ -316,6 +316,47 @@ class Solution { return true; } } +//方法一:但使用stringBuilder,故优化时间、空间复杂度,因为向字符串插入字符时无需复制整个字符串,从而减少了操作的时间复杂度,也不用开新空间存subString,从而减少了空间复杂度。 +class Solution { + List result = new ArrayList(); + public List restoreIpAddresses(String s) { + StringBuilder sb = new StringBuilder(s); + backTracking(sb, 0, 0); + return result; + } + private void backTracking(StringBuilder s, int startIndex, int dotCount){ + if(dotCount == 3){ + if(isValid(s, startIndex, s.length() - 1)){ + result.add(s.toString()); + } + return; + } + for(int i = startIndex; i < s.length(); i++){ + if(isValid(s, startIndex, i)){ + s.insert(i + 1, '.'); + backTracking(s, i + 2, dotCount + 1); + s.deleteCharAt(i + 1); + }else{ + break; + } + } + } + //[start, end] + private boolean isValid(StringBuilder s, int start, int end){ + if(start> end) + return false; + if(s.charAt(start) == '0' && start != end) + return false; + int num = 0; + for(int i = start; i <= end; i++){ + int digit = s.charAt(i) - '0'; + num = num * 10 + digit; + if(num> 255) + return false; + } + return true; + } +} //方法二:比上面的方法时间复杂度低,更好地剪枝,优化时间复杂度 class Solution { @@ -360,6 +401,7 @@ class Solution { } ``` + ## python 回溯(版本一) diff --git "a/problems/0376.346円221円206円345円212円250円345円272円217円345円210円227円.md" "b/problems/0376.346円221円206円345円212円250円345円272円217円345円210円227円.md" index 285a0280a5..08de23ae24 100644 --- "a/problems/0376.346円221円206円345円212円250円345円272円217円345円210円227円.md" +++ "b/problems/0376.346円221円206円345円212円250円345円272円217円345円210円227円.md" @@ -99,7 +99,7 @@ 这里我们可以写死,就是 如果只有两个元素,且元素不同,那么结果为 2。 -不写死的话,如果和我们的判断规则结合在一起呢? +不写死的话,如何和我们的判断规则结合在一起呢? 可以假设,数组最前面还有一个数字,那这个数字应该是什么呢? diff --git "a/problems/0503.344円270円213円344円270円200円344円270円252円346円233円264円345円244円247円345円205円203円347円264円240円II.md" "b/problems/0503.344円270円213円344円270円200円344円270円252円346円233円264円345円244円247円345円205円203円347円264円240円II.md" index bf65120923..3fd4b3b6db 100644 --- "a/problems/0503.344円270円213円344円270円200円344円270円252円346円233円264円345円244円247円345円205円203円347円264円240円II.md" +++ "b/problems/0503.344円270円213円344円270円200円344円270円252円346円233円264円345円244円247円345円205円203円347円264円240円II.md" @@ -164,6 +164,7 @@ class Solution { Python: ```python +# 方法 1: class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: dp = [-1] * len(nums) @@ -174,6 +175,26 @@ class Solution: stack.pop() stack.append(i%len(nums)) return dp + +# 方法 2: +class Solution: + def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: + stack = [] + # 创建答案数组 + ans = [-1] * len(nums1) + for i in range(len(nums2)): + while len(stack)> 0 and nums2[i]> nums2[stack[-1]]: + # 判断 num1 是否有 nums2[stack[-1]]。如果没有这个判断会出现指针异常 + if nums2[stack[-1]] in nums1: + # 锁定 num1 检索的 index + index = nums1.index(nums2[stack[-1]]) + # 更新答案数组 + ans[index] = nums2[i] + # 弹出小元素 + # 这个代码一定要放在 if 外面。否则单调栈的逻辑就不成立了 + stack.pop() + stack.append(i) + return ans ``` Go: ```go

AltStyle によって変換されたページ (->オリジナル) /