Skip to content

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]

解题思路

alt text

代码实现

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)) 。

解题思路

alt text

代码实现

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;
    }
}