力扣刷题
力扣算法题——这里都是自己做过的,打算从2025年8月开始能保持在一天一道的频率。力扣热门100题进行了标注。我看热门题里面二叉树和动态规划是不太熟的,要抽时间花功夫学习一下。
哈希
2025-07-16 1. 两数之和简单
给定一个整数数组
nums和一个整数目标值target,请你在该数组中找出 和为目标值target的那 两个 整数,并返回它们的数组下标。题解:用hash值中的containskey方法,遍历一遍数组,存在和target-num1一样大的数字num2,代表num1+num2=target,value记录下标。
1 | class Solution { |
2025-07-16 49. 字母异位词分组中等
题解:遍历子串数组,全部按acsill码排序。排好序向map中添加,存在就列表添加,不存在创建key,打印value
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
1 | class Solution { |
2025-07-22 128. 最长连续序列中等
题解:先将所有数字放hashset中,存在遍历set,存在当前数字小1的中断当前循环。这样能最小开始算,当有比当前数字大1的while循环,一直+1,直到不存在,记录长度。这样就能找到最长连续的整数长度。
给定一个未排序的整数数组
nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
1 | class Solution { |
双指针
2025-07-06 283. 移动零简单
题解:把遍历的所有非零数给新数组,两个数组一样长,新数组没赋值的后面全0
给定一个数组
nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
1 | class Solution { |
2025-07-23 11. 盛最多水的容器中等
题解:左右指针,一个在最左边一个在最右边,当左边高度比右边小,建立临时变量为当前左侧长度,一直左指针右移,直到大于外循环左侧长度统计最大值。同理当右侧小,右侧向左边移。为什么可以这样移动?因为只要某一侧移动的时候,遇到的柱子比之前短,就一定代表存储量小,底短了高也短了。
给定一个长度为
n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

1 | class Solution { |
2025-07-16 15. 三数之和中等
题解:找到三个数相加为0,先排序,从左向右遍历,同时设置左右指针,左指针是当前索引+1,右指针是右侧,判断内缩,大于0右收缩,小于0左收缩。为0就收集并且去重左右指针移动,去除重复值。
给你一个整数数组
nums,判断是否存在三元组[nums[i], nums[j], nums[k]]满足i != j、i != k且j != k,同时还满足nums[i] + nums[j] + nums[k] == 0。请你返回所有和为0且不重复的三元组。
1 | import java.util.AbstractList; |
2025-07-24 42. 接雨水困难
题解:
1 | class Solution { |
滑动窗口
2025-07-19 3. 无重复字符的最长子串中等
题解:
1 | class Solution { |
2025-07-29 438. 找到字符串中所有字母异位词中等
题解:
1 | class Solution { |
子串
2025-07-31 560. 和为 K 的子数组中等
题解:
1 | class Solution { |
2025-08-01 239. 滑动窗口最大值困难
tag -——队列 数组 滑动 窗口 单调队列 堆(优先队列)
题解:用栈的思想,窗口为k位,刚开始不进while循环,当队列长度大于k以后进行操作。将队列中如果靠前的数后面有比它大的就弹出,将最大值放进res
1 | class Solution { |
2025-08-08 76. 最小覆盖子串困难
题解:通过distance标志位,当右指针遍历到全部的子串,进循环看左侧,左侧减少到子串的某值统计长度,当左侧等于目标子串之一,distance减少,右指针 继续找,找到distance,左侧再收缩
1 | //76 覆盖子串(滑动窗口) |
普通数组
矩阵
链表
二叉树
图论
回溯
回溯模版以及三部曲
三部曲:函数参数和返回值、终止条件、单层搜索逻辑1
2
3
4
5
6
7
8
9
10
11
12
13
14
15private void backtracking(int[] candidates, int target, int index, List<List<Integer>> result, List<Integer> tempList) {
//终止条件
if (target == 0) {
result.add(new ArrayList<>(tempList));
return;
}
//单层搜索条件
for (int i = index; i < candidates.length; i++) {
if (candidates[i] <= target) {
tempList.add(candidates[i]);
backtracking(candidates, target - candidates[i], i, result, tempList);
tempList.remove(tempList.size() - 1);
}
}
}
N皇后
刚开始以为很难的,梳理完思路,做起来舒服多了,先定义一个全部为.的二维数组作为棋盘。终止条件就是便利到最后一行终止做回溯,搜索逻辑中只有当棋盘位置允许皇后放置的时候才能放置。放完以后继续进入,行数+1,回溯的时候将对应位置从Q改成.即可。由于是从上往下,从左往右便利棋盘的,所以可以把判断合法函数只用检验列和左上和右上就好了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75package org.yoki.dfs;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: youqi.sjh
* @Date: 2025/10/30 20:07
* @Description: N皇后
*/
public class LC51 {
public static void main(String[] args) {
LC51 lc51 = new LC51();
List<List<String>> res = lc51.solveNQueens(4);
System.out.println(res);
}
public List<List<String>> solveNQueens(int n) {
List<List<String>> res = new ArrayList<>();
//棋盘
String[][] checkBoard = new String[n][n];
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
checkBoard[i][j] = ".";
}
}
backTracking(checkBoard,0,res,new ArrayList<String>());
return res;
}
private void backTracking(String[][] checkBoard, int row, List<List<String>> res, List<String> path) {
if (row == checkBoard.length){
res.add(new ArrayList<>(path));
return;
}
for (int i = 0; i < checkBoard.length; i++){
if (!isValid(checkBoard,row,i)){
continue;
}
checkBoard[row][i] = "Q";
StringBuilder pathString = new StringBuilder();
for (int j = 0; j < checkBoard.length; j++){
pathString.append(checkBoard[row][j]);
}
path.add(pathString.toString());
backTracking(checkBoard,row+1,res,path);
checkBoard[row][i] = ".";
path.remove(path.size()-1);
}
}
private boolean isValid(String[][] checkBoard, int row, int col) {
// 检查列冲突
for (int i = 0; i < row; i++) {
if ("Q".equals(checkBoard[i][col])) {
return false;
}
}
// 检查45度对角线冲突(左上方向)
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if ("Q".equals(checkBoard[i][j])) {
return false;
}
}
// 检查135度对角线冲突(右上方向)
for (int i = row - 1, j = col + 1; i >= 0 && j < checkBoard.length; i--, j++) {
if ("Q".equals(checkBoard[i][j])) {
return false;
}
}
return true;
}
}





