File tree Expand file tree Collapse file tree 4 files changed +95
-0
lines changed Expand file tree Collapse file tree 4 files changed +95
-0
lines changed Original file line number Diff line number Diff line change 1
1
1. 两数之和
2
+ 2. 两数相加
3
+ 3. 无重复字符的最长子串
2
4
20. 有效的括号
3
5
21. 合并两个有序链表
4
6
53. 最大子数组和
Original file line number Diff line number Diff line change
1
+ // 两数相加
2
+
3
+
4
+ /**
5
+ * Definition for singly-linked list.
6
+ * public class ListNode {
7
+ * int val;
8
+ * ListNode next;
9
+ * ListNode() {}
10
+ * ListNode(int val) { this.val = val; }
11
+ * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
12
+ * }
13
+ */
14
+
15
+
16
+ /*
17
+ 1、同时遍历两个链表,对应位置的值相加,且加上进位值,计算新的进位值,创建新的节点
18
+ 2、两个链表长度不同,则短链表后面默认为0
19
+ 3、链表遍历结束后,如果进位值为1,需要再加一个节点
20
+ */
21
+ class Solution {
22
+ public ListNode addTwoNumbers (ListNode l1 , ListNode l2 ) {
23
+ ListNode head = new ListNode (0 );
24
+ ListNode cur = head ;
25
+ int add = 0 ;
26
+ while (l1 != null || l2 != null || add != 0 ) {
27
+ int l1Val = l1 != null ? l1 .val : 0 ;
28
+ int l2Val = l2 != null ? l2 .val : 0 ;
29
+ int num = l1Val + l2Val + add ;
30
+ add = num / 10 ;
31
+ cur .next = new ListNode (num % 10 );
32
+ cur = cur .next ;
33
+ l1 = l1 != null ? l1 .next : null ;
34
+ l2 = l2 != null ? l2 .next : null ;
35
+ }
36
+ return head .next ;
37
+ }
38
+ }
Original file line number Diff line number Diff line change
1
+ // 无重复字符的最长子串
2
+
3
+
4
+ /*
5
+ 索引定位收缩左区间:
6
+ 1、HashMap保存滑动窗口中的字符的索引
7
+ 2、如果右指针移动过程新的字符 出现 在滑动窗口中,则更新左指针位置
8
+ 3、更新当前字符在HashMap中的索引
9
+ 4、右指针每移动一次后,计算新窗口的长度,比较并保存最大长度
10
+ */
11
+ class Solution {
12
+ public int lengthOfLongestSubstring (String s ) {
13
+ int maxLen = 0 , start = 0 ;
14
+ Map <Character , Integer > map = new HashMap <>();
15
+ for (int i = 0 ; i < s .length (); i ++) {
16
+ char c = s .charAt (i );
17
+ if (map .containsKey (c )) {
18
+ start = Math .max (map .get (c ) + 1 , start );
19
+ }
20
+ map .put (c , i );
21
+ maxLen = Math .max (maxLen , i - start + 1 );
22
+ }
23
+ return maxLen ;
24
+ }
25
+ }
26
+
27
+
28
+ /*
29
+ 左指针右移收缩左区间:
30
+ 1、HashMap保存滑动窗口中的字符的出现次数
31
+ 2、如果右指针移动过程新的字符 没有 在滑动窗口中,则将字符添加到HashMap中,次数记为1
32
+ 3、如果右指针移动过程新的字符 出现 在滑动窗口中,则移动左指针直到同样该字符的下一位,移动过程指向的字符在HashMap中出现次数减1
33
+ 4、右指针每移动一次后,计算新窗口的长度,比较并保存最大长度
34
+ */
35
+ class Solution {
36
+ public int lengthOfLongestSubstring (String s ) {
37
+ int maxLen = 0 , start = 0 ;
38
+ Map <Character , Integer > map = new HashMap <>();
39
+ for (int i = 0 ; i < s .length (); i ++) {
40
+ char c = s .charAt (i );
41
+ if (map .getOrDefault (c , 0 ) == 0 ) {
42
+ map .put (c , 1 );
43
+ } else {
44
+ while (s .charAt (start ) != c ) {
45
+ map .put (s .charAt (start ), map .get (s .charAt (start )) -1 );
46
+ start ++;
47
+ }
48
+ start ++;
49
+ }
50
+ maxLen = Math .max (maxLen , i - start + 1 );
51
+ }
52
+ return maxLen ;
53
+ }
54
+ }
Original file line number Diff line number Diff line change @@ -39,6 +39,7 @@ public boolean isPalindrome(ListNode head) {
39
39
1、通过递归实现在链表上双指针判断首尾元素是否一样
40
40
2、使用成员变量作为头部指针,该指针不受递归影响,每次判断完向后移动一步
41
41
3、通过递归直接到达链表尾部指针,此时通过首尾指针判断元素是否一样,下一层递归结束后返回上一层,相当于尾部指针往前移动一步
42
+ 4、先判断上一层处理结果元素是否一样,是的话再判断当前层元素是否一样
42
43
*/
43
44
class Solution {
44
45
private ListNode left ;
You can’t perform that action at this time.
0 commit comments