17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
**输入:**digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
**输入:**digits = “2”
输出:[“a”,“b”,“c”]
提示:
1 <= digits.length <= 4
digits[i] 是范围 [‘2’, ‘9’] 的一个数字。
对digits中每个数字讨论其情况即可
与求子集类似,只不过每个元素对应的情况变多了
1234567891011121314151617181920212223class Solution {public: vector<string> ans; unordered_map<char, string> phoneMap{ {'2', "abc&q ...
15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
**注意:**答案中不可以包含重复的三元组。
示例 1:
**输入:**nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:
**输入:**nums = [0,1,1]
输出:[]
**解释:**唯一可能的三元组和不为 0 。
示例 3:
**输入:* ...
11. 盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
**说明:**你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
**输出:**49
**解释:**图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
**输入:**height = [1,1]
**输出:**1
提示:
n == height.length
2 <= n <= 10(5)
0 <= height[i] <= 10(4)
需要找到两个值,考虑使用双指针
因为要考虑x轴的大小,所以我们可以先从两头开始,这样两个指针只会往中间收缩,x是不断变小的,我们只需要考虑高度关系,寻找更高的两方。
又因为每次容量限制都取决于较矮的一方,所以我们每次只需要更新矮的一方即可
12345678910111213141 ...
4. 寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
**输入:**nums1 = [1,3], nums2 = [2]
**输出:**2.00000
**解释:**合并数组 = [1,2,3] ,中位数 2
示例 2:
**输入:**nums1 = [1,2], nums2 = [3,4]
**输出:**2.50000
**解释:**合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-10(6) <= nums1[i], nums2[i] <= 10(6)
中位数本质上是把这两个数组分成了两部分
左部分数<右部分数,且数量最多相差1
所以我们可以寻找一个i来划分nums1,根据m和n从而得 ...
3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。注意 “bca” 和 “cab” 也是正确答案。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 10(4)
s 由英文字母、数字、符号和空格组成
采用滑动窗口,维护一个无重复字符字串,
当进入一个已存在字符时更新左边界,所以我们需要通过哈希表记录窗口中字符索引,
更新时需判断 左边界 与重复字符索引的大小关系,只能往右更新,所以取较大值
12345678910111213141516171819202122232425class Solution ...
2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
**输入:**l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
**解释:**342 + 465 = 807.
示例 2:
**输入:**l1 = [0], l2 = [0]
输出:[0]
示例 3:
**输入:**l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
模拟加法运算
注意进位和链表长度不相等的情况,最后如果还有进位需要创建新结点
123456789101112131415161718192021222324252627class Solution {public: ListNode ...







