diff --git a/problems/0001.两数之和.md b/problems/0001.两数之和.md index 2d3d6ea3..a0acdcbe 100644 --- a/problems/0001.两数之和.md +++ b/problems/0001.两数之和.md @@ -79,7 +79,7 @@ map目的用来存放我们访问过的元素,因为遍历数组的时候, 所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。 -在遍历数组的时候,只需要向map去查询是否有和目前遍历元素比配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。 +在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。 过程如下: diff --git a/problems/0206.翻转链表.md b/problems/0206.翻转链表.md index 016477ae..b87c7cba 100644 --- a/problems/0206.翻转链表.md +++ b/problems/0206.翻转链表.md @@ -682,7 +682,33 @@ public class LinkNumbers +## 使用虚拟头结点解决链表翻转 + +> 使用虚拟头结点,通过头插法实现链表的翻转(不需要栈) + +```java +// 迭代方法:增加虚头结点,使用头插法实现链表翻转 +public static ListNode reverseList1(ListNode head) { + // 创建虚头结点 + ListNode dumpyHead = new ListNode(-1); + dumpyHead.next = null; + // 遍历所有节点 + ListNode cur = head; + while(cur != null){ + ListNode temp = cur.next; + // 头插法 + cur.next = dumpyHead.next; + dumpyHead.next = cur; + cur = temp; + } + return dumpyHead.next; +} +``` + + + ## 使用栈解决反转链表的问题 + * 首先将所有的结点入栈 * 然后创建一个虚拟虚拟头结点,让cur指向虚拟头结点。然后开始循环出栈,每出来一个元素,就把它加入到以虚拟头结点为头结点的链表当中,最后返回即可。 @@ -720,3 +746,4 @@ public ListNode reverseList(ListNode head) { + diff --git a/problems/0501.二叉搜索树中的众数.md b/problems/0501.二叉搜索树中的众数.md index cb14fb14..4214e232 100644 --- a/problems/0501.二叉搜索树中的众数.md +++ b/problems/0501.二叉搜索树中的众数.md @@ -476,6 +476,7 @@ class Solution { ## Python > 递归法 +> 常量空间,递归产生的栈不算 ```python # Definition for a binary tree node. @@ -521,7 +522,9 @@ class Solution: ``` -> 迭代法-中序遍历-不使用额外空间,利用二叉搜索树特性 +> 迭代法-中序遍历 +> 利用二叉搜索树特性,在历遍过程中更新结果,一次历遍 +> 但需要使用额外空间存储历遍的节点 ```python class Solution: def findMode(self, root: TreeNode) -> List[int]: diff --git a/problems/回溯算法去重问题的另一种写法.md b/problems/回溯算法去重问题的另一种写法.md index 73862156..b3bd74da 100644 --- a/problems/回溯算法去重问题的另一种写法.md +++ b/problems/回溯算法去重问题的另一种写法.md @@ -285,7 +285,38 @@ class Solution { } ``` +**90.子集II** +```java +class Solution { + List> reslut = new ArrayList<>(); + LinkedList path = new LinkedList<>(); + + public List> subsetsWithDup(int[] nums) { + if(nums.length == 0){ + reslut.add(path); + return reslut; + } + Arrays.sort(nums); + backtracking(nums,0); + return reslut; + } + public void backtracking(int[] nums,int startIndex){ + reslut.add(new ArrayList<>(path)); + if(startIndex >= nums.length)return; + HashSet hashSet = new HashSet<>(); + for(int i = startIndex; i < nums.length; i++){ + if(hashSet.contains(nums[i])){ + continue; + } + hashSet.add(nums[i]); + path.add(nums[i]); + backtracking(nums,i+1); + path.removeLast(); + } + } +} +``` Python: