Skip to content

Commit 82fc1ca

Browse files
committed
2 parents a748e2f + ff2ec86 commit 82fc1ca

30 files changed

+1457
-59
lines changed

problems/0001.两数之和.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,21 @@ func twoSum(nums []int, target int) []int {
136136
}
137137
```
138138

139+
```go
140+
// 使用map方式解题,降低时间复杂度
141+
func twoSum(nums []int, target int) []int {
142+
m := make(map[int]int)
143+
for index, val := range nums {
144+
if preIndex, ok := m[target-val]; ok {
145+
return []int{preIndex, index}
146+
} else {
147+
m[val] = index
148+
}
149+
}
150+
return []int{}
151+
}
152+
```
153+
139154
Rust
140155

141156
```rust

problems/0024.两两交换链表中的节点.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,23 @@ class Solution {
129129
```
130130

131131
Python:
132+
```python
133+
class Solution:
134+
def swapPairs(self, head: ListNode) -> ListNode:
135+
dummy = ListNode(0) #设置一个虚拟头结点
136+
dummy.next = head
137+
cur = dummy
138+
while cur.next and cur.next.next:
139+
tmp = cur.next #记录临时节点
140+
tmp1 = cur.next.next.next #记录临时节点
141+
142+
cur.next = cur.next.next #步骤一
143+
cur.next.next = tmp #步骤二
144+
cur.next.next.next = tmp1 #步骤三
145+
146+
cur = cur.next.next #cur移动两位,准备下一轮交换
147+
return dummy.next
148+
```
132149

133150
Go:
134151
```go

problems/0039.组合总和.md

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -237,34 +237,28 @@ public:
237237

238238
Java:
239239
```Java
240+
// 剪枝优化
240241
class Solution {
241-
List<List<Integer>> lists = new ArrayList<>();
242-
Deque<Integer> deque = new LinkedList<>();
243-
244-
public List<List<Integer>> combinationSum3(int k, int n) {
245-
int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
246-
backTracking(arr, n, k, 0);
247-
return lists;
242+
public List<List<Integer>> combinationSum(int[] candidates, int target) {
243+
List<List<Integer>> res = new ArrayList<>();
244+
Arrays.sort(candidates); // 先进行排序
245+
backtracking(res, new ArrayList<>(), candidates, target, 0, 0);
246+
return res;
248247
}
249248

250-
public void backTracking(int[] arr, int n, int k, int startIndex) {
251-
//如果 n 小于0,没必要继续本次递归,已经不符合要求了
252-
if (n < 0) {
253-
return;
254-
}
255-
if (deque.size() == k) {
256-
if (n == 0) {
257-
lists.add(new ArrayList(deque));
258-
}
249+
public void backtracking(List<List<Integer>> res, List<Integer> path, int[] candidates, int target, int sum, int idx) {
250+
// 找到了数字和为 target 的组合
251+
if (sum == target) {
252+
res.add(new ArrayList<>(path));
259253
return;
260254
}
261-
for (int i = startIndex; i < arr.length - (k - deque.size()) + 1; i++) {
262-
deque.push(arr[i]);
263-
//减去当前元素
264-
n -= arr[i];
265-
backTracking(arr, n, k, i + 1);
266-
//恢复n
267-
n += deque.pop();
255+
256+
for (int i = idx; i < candidates.length; i++) {
257+
// 如果 sum + candidates[i] > target 就终止遍历
258+
if (sum + candidates[i] > target) break;
259+
path.add(candidates[i]);
260+
backtracking(res, path, candidates, target, sum + candidates[i], i);
261+
path.remove(path.size() - 1); // 回溯,移除路径 path 最后一个元素
268262
}
269263
}
270264
}

problems/0045.跳跃游戏II.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,26 @@ func jump(nums []int) int {
208208
}
209209
return dp[len(nums)-1]
210210
}
211+
```
212+
213+
Javascript:
214+
```Javascript
215+
var jump = function(nums) {
216+
let curIndex = 0
217+
let nextIndex = 0
218+
let steps = 0
219+
for(let i = 0; i < nums.length - 1; i++) {
220+
nextIndex = Math.max(nums[i] + i, nextIndex)
221+
if(i === curIndex) {
222+
curIndex = nextIndex
223+
steps++
224+
}
225+
}
226+
227+
return steps
228+
};
229+
```
230+
211231
/*
212232
dp[i]表示从起点到当前位置的最小跳跃次数
213233
dp[i]=min(dp[j]+1,dp[i]) 表示从j位置用一步跳跃到当前位置,这个j位置可能有很多个,却最小一个就可以

problems/0056.合并区间.md

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -141,16 +141,7 @@ Java:
141141
class Solution {
142142
public int[][] merge(int[][] intervals) {
143143
List<int[]> res = new LinkedList<>();
144-
Arrays.sort(intervals, new Comparator<int[]>() {
145-
@Override
146-
public int compare(int[] o1, int[] o2) {
147-
if (o1[0] != o2[0]) {
148-
return Integer.compare(o1[0],o2[0]);
149-
} else {
150-
return Integer.compare(o1[1],o2[1]);
151-
}
152-
}
153-
});
144+
Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
154145

155146
int start = intervals[0][0];
156147
for (int i = 1; i < intervals.length; i++) {

problems/0101.对称二叉树.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,54 @@ Python:
363363

364364
Go:
365365

366+
```go
367+
/**
368+
* Definition for a binary tree node.
369+
* type TreeNode struct {
370+
* Val int
371+
* Left *TreeNode
372+
* Right *TreeNode
373+
* }
374+
*/
375+
// 递归
376+
func defs(left *TreeNode, right *TreeNode) bool {
377+
if left == nil && right == nil {
378+
return true;
379+
};
380+
if left == nil || right == nil {
381+
return false;
382+
};
383+
if left.Val != right.Val {
384+
return false;
385+
}
386+
return defs(left.Left, right.Right) && defs(right.Left, left.Right);
387+
}
388+
func isSymmetric(root *TreeNode) bool {
389+
return defs(root.Left, root.Right);
390+
}
391+
392+
// 迭代
393+
func isSymmetric(root *TreeNode) bool {
394+
var queue []*TreeNode;
395+
if root != nil {
396+
queue = append(queue, root.Left, root.Right);
397+
}
398+
for len(queue) > 0 {
399+
left := queue[0];
400+
right := queue[1];
401+
queue = queue[2:];
402+
if left == nil && right == nil {
403+
continue;
404+
}
405+
if left == nil || right == nil || left.Val != right.Val {
406+
return false;
407+
};
408+
queue = append(queue, left.Left, right.Right, right.Left, left.Right);
409+
}
410+
return true;
411+
}
412+
```
413+
366414

367415
JavaScript
368416
```javascript

0 commit comments

Comments
 (0)