LC1-两数之和(map+双指针)

描述;无序数组,找两个数和为目标值,结果只有一组,返回数组下标
思路:
(1)暴力枚举所有下标组合,O(NN)
(2)使用map记录枚举过的值和下标({va:index},遍历数组,若target-当前元素的差值存在于map的key中,那么找到答案,否则将当前元素的值和下标存入map
延伸问题:若有多组答案,如何找出所有答案,注意答案不能重复
使用set去重:
延伸问题:三数之和
三数之和
排序+第一层循环去重+第二重循环双指针
延伸问题:四数之和
四数之和
排序+第一层循环去重+第二重循环去重+第三层循环双指针
延伸问题:有序数组,找两个数和为目标值,结果只有一组,返回数组下标
双指针
两数之和 II - 输入有序数组
延伸问题:一个数组,一个整数k,求和等于k的连续子数组个数
为K的子数组
(1)枚举所有区间组合,O(N
N)
(2)前缀和+map
设f(i)为以下标i结尾的连续子数组的和,
前缀和:g(i)表示下标从0到i的连续子数组的和,
map存放{val:count},和为val的连续子数组个数为count
遍历数组,遍历到i位置时,判断map中是否存在k-nums[i]的key,计算当前累积和sum,map.put(sum, map.getOrDefault(sum,0)+1).
延伸问题:给一个二叉搜索树和一个目标值k,判断BST中是否存在两个元素的和等于目标值
(1)set+遍历(层次/DFS:前、中、后)
(2)中序遍历存放结果序列+双指针
总结:多个数字的和、数组是否有序、连续子数组和、排序二叉树元素和

LC2-两数相加(双指针)

描述:单链表表示数字,链表头表示最低位,求两个链表表示的数字的和,答案也用链表表示,表头最低位
思路:
双指针,从链表头开始遍历,help节点+尾插法,注意遍历完链表处理carry进位可能需要额外创建最高位
延伸:链表表示数字,表头表示最高位怎么处理?答案也要求用最高位怎么处理?
445. 两数相加 II
使用两个栈来逆反得到两个链表从尾到头的顺序序列,然后help节点+头插法,注意遍历完链表处理carry进位可能需要额外创建最高位
延伸:字符串表示数字num1、num2,返回乘积
字符串相乘
根据乘法的竖式法则,转换为大数加法,从右到左遍历字符串num2,依次每一位数字和num1相乘,将结果累计,注意num2除了最低位数其他的结果要补0。
延伸:两个字符串,表示二进制数字,求和
67. 二进制求和
大数加法,逢2进1,注意处理最后的carry位
延伸:不使用运算符 + 和 - ,计算两整数 a 、b 之和。
371. 两整数之和
使用位运算代替+、-
从二进制角度来看,通过观察得到:
a和b的无进位和,异或:sum = a ^ b
a和b的有进位和的进位数字,与操作并左移一位:sum = (a&b)<<1
有进位时,要再次把进位数字和结果继续做加法。
延伸:两个字符串,十进制整数,求和
415. 字符串相加
大数加法,逢10进1,注意处理最后的carry位
延伸:定义一个数的数组形式为:“用一个数组表示一个数字A,每个表示数字的每一个数位,最左边表示最高位”,再给一个数字K,计算A+K的数组形式。
989. 数组形式的整数加法
不能将数组形式换算为数字然后用加法,因为可能溢出,应该把数字转换为字符串,用大数加法
总结:链表表示字符串的和、数组表示字符串的和、二进制或十进制的话、大数加法、大数乘法、大数除法、不用加号或减号做加法

LC3-无重复字符的最长子串(滑动窗口)

描述:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。(答案是一个最长子串,不重复)
用一个map保存滑动窗口中的元素,{val:index},每次移动右指针后,都判断是否窗口中有重复,若有重复则调整左指针位置,然后更新最长无重复子串长度
延伸1:给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度。(答案是一个最长子串,最多包含两个不同字符)
159. 至多包含两个不同字符的最长子串
用一个map保存滑动窗口中的元素,{val:index},窗口内最多只有有两个key,每次移动右指针后若导致key数量>2,则移动左指针使得key数量=2,更新最长字串
延伸2:给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T。(答案是一个最长子串,最多包含k个不同字符)
340. 至多包含 K 个不同字符的最长子串
同” 延伸2 “,用map保存窗口内字符{key:count},窗口内最多包含k个key,
延伸3:给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定不同的子数组为好子数组。
992. K 个不同整数的子数组
同延伸2: