深浅模式
LeetCode
更新: 3/6/2026 字数: 0 字
1.两数之和
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案
示例
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
代码实现
java
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int x = target - nums[i];
if (map.containsKey(x)) {
return new int[] { map.get(x), i };
}
map.put(nums[i], i);
}
return new int[2];
}
}2.两数相加
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
示例
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
输入:l1 = [0], l2 = [0]
输出:[0]
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
解题思路
代码实现
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int in = 0;
ListNode head = new ListNode();
ListNode tail = head;
while (l1 != null || l2 != null || in != 0) {
int l1Val = l1 == null ? 0 : l1.val;
int l2Val = l2 == null ? 0 : l2.val;
int sum = l1Val + l2Val + in;
tail.next = new ListNode(sum % 10);
in = sum / 10;
l1 = l1 == null ? null : l1.next;
l2 = l2 == null ? null : l2.next;
tail = tail.next;
}
return head.next;
}
}3.无重复字符的最长子串
题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
示例
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路
滑动窗口
代码实现
java
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> last = new HashMap<>();
int start = 0;
int res = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (last.containsKey(c)) {
start = Math.max(start, last.get(c) + 1);
}
res = Math.max(res, i - start + 1);
System.out.println("第" + i + "个字符:'" + s.charAt(i) + "',start:" + start + ",res:" + res);
last.put(c, i);
}
return res;
}
}输出
第0个字符:'a',start:0,res:1
第1个字符:'b',start:0,res:2
第2个字符:'c',start:0,res:3
第3个字符:'a',start:1,res:3
第4个字符:'b',start:2,res:3
第5个字符:'c',start:3,res:3
第6个字符:'b',start:5,res:3
第7个字符:'b',start:7,res:3
4. 寻找两个正序数组的中位数
题目描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
解题思路
代码实现
java
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int total = m + n;
if (total % 2 == 1) {
// 奇数取中位
return findKth(nums1, 0, nums2, 0, total / 2 + 1);
}
// 偶数取中间两位数平均值
return (findKth(nums1, 0, nums2, 0, total / 2) + findKth(nums1, 0, nums2, 0, total / 2 + 1)) / 2.0;
}
public int findKth(int[] a, int i, int[] b, int j, int k) {
int la = a.length;
int lb = b.length;
if (i >= la) {
// 中位数在b数组
return b[j + k - 1];
}
if (j >= lb) {
// 中位数在a数组
return a[i + k - 1];
}
if (k == 1) {
// 找到最小
return Math.min(a[i], b[j]);
}
int halfK = k / 2;
int halfA = i + halfK - 1;
// a数组取中位数
int mixA = halfA < la ? a[halfA] : Integer.MAX_VALUE;
int halfB = j + halfK - 1;
// b数组取中位数
int mixB = halfB < lb ? b[halfB] : Integer.MAX_VALUE;
if (mixA < mixB) {
// a数组中位数之前的都丢弃
return findKth(a, i + halfK, b, j, k - halfK);
}
// b数组中位数之前的都丢弃
return findKth(a, i, b, j + halfK, k - halfK);
}
}5. 最长回文子串
题目描述
给你一个字符串 s,找到 s 中最长的 回文 子串。
示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2: 输入:s = "cbbd" 输出:"bb"
提示: 1 <= s.length <= 1000 s 仅由数字和英文字母组成
代码实现
java
class Solution {
public String longestPalindrome(String s) {
char[] array = s.toCharArray();
int start = 0;
int end = 0;
for (int i = 0; i < array.length; i++) {
int s1 = expandAroundCenter(array, i, i);
int s2 = expandAroundCenter(array, i, i + 1);
int len = Math.max(s1, s2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
private int expandAroundCenter(char[] array, int left, int right) {
while (left >= 0 && right < array.length && array[left] == array[right]) {
left--;
right++;
}
return right - left - 1;
}
}