Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • 哈希表

  • 双指针

  • 数组

  • 字符串

  • 链表

  • 树

  • 回溯

  • 动态规划

  • 图

  • 二分查找

  • 贪心

  • 栈&队列

  • 堆

  • 位运算

  • 数据结构设计

  • rui的精选题单

    • 面试高频题
    • hot100
    • 经典150(针对hot100补充)
      • 数组/字符串
        • 88. 合并两个有序数组
        • 27. 移除元素
        • 26. 删除有序数组中的重复项
        • 80. 删除有序数组中的重复项 II
        • 122. 买卖股票的最佳时机 II
        • 274. H 指数
        • 380. O(1) 时间插入、删除和获取随机元素
        • 134. 加油站
        • 135. 分发糖果
        • 13. 罗马数字转整数
        • 12. 整数转罗马数字
        • 58. 最后一个单词的长度
        • 14. 最长公共前缀
        • 151. 反转字符串中的单词
        • 6. Z 字形变换
        • 28. 找出字符串中第一个匹配项的下标
        • 68. 文本左右对齐
      • 双指针
        • 125. 验证回文串
        • 392. 判断子序列
        • 167. 两数之和 II - 输入有序数组
      • 滑动窗口
        • 209. 长度最小的子数组
        • 30. 串联所有单词的子串
      • 矩阵
        • 36. 有效的数独
        • 289. 生命游戏
      • 哈希表
        • 383. 赎金信
        • 205. 同构字符串
        • 290. 单词规律
        • 242. 有效的字母异位词
        • 202. 快乐数
        • 219. 存在重复元素 II
      • 区间
        • 228. 汇总区间
        • 57. 插入区间
        • 452. 用最少数量的箭引爆气球
      • 栈
        • 71. 简化路径
        • 150. 逆波兰表达式求值
        • 224. 基本计算器
      • 链表
        • 92. 反转链表 II
        • 82. 删除排序链表中的重复元素 II
        • 61. 旋转链表
        • 86. 分隔链表
      • 二叉树
        • 100. 相同的树
        • 106. 从中序与后序遍历序列构造二叉树
        • 117. 填充每个节点的下一个右侧节点指针 II
        • 129. 求根节点到叶节点数字之和
        • 112. 路径总和
        • 173. 二叉搜索树迭代器
        • 222. 完全二叉树的节点个数
        • 637. 二叉树的层平均值
        • 103. 二叉树的锯齿形层序遍历
        • 530. 二叉搜索树的最小绝对差
        • 427. 建立四叉树
      • 图
        • 130. 被围绕的区域
        • 133. 克隆图
        • 399. 除法求值
        • 210. 课程表 II
        • 909. 蛇梯棋
        • 433. 最小基因变化
        • 127. 单词接龙
      • 字典树
        • 211. 添加与搜索单词 - 数据结构设计
        • 212. 单词搜索 II
      • 回溯
        • 52. N 皇后 II
      • Kadane算法
        • 53. 最大子数组和
        • 918. 环形子数组的最大和
      • 堆
        • 373. 查找和最小的 K 对数字
        • 502. IPO
      • 位运算
        • 67. 二进制求和
        • 190. 颠倒二进制位
        • 191. 位1的个数
        • 137. 只出现一次的数字 II
        • 201. 数字范围按位与
      • 数学
        • 9. 回文数
        • 66. 加一
        • 172. 阶乘后的零
        • 69. x 的平方根
        • 50. Pow(x, n)
        • 149. 直线上最多的点数
      • 动态规划
        • 120. 三角形最小路径和
        • 63. 不同路径 II
        • 97. 交错字符串
        • 123. 买卖股票的最佳时机 III
        • 188. 买卖股票的最佳时机 IV
        • 221. 最大正方形
    • 剑指offer(针对hot100补充)
  • 笔试真题

  • LeetCode周赛

  • ACM模式输入输出
  • 数学

  • 数据结构与算法
  • rui的精选题单
Nreal
2024-02-21
目录

经典150(针对hot100补充)

# 数组/字符串

# 88. 合并两个有序数组 (opens new window)

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] arr1 = new int[m];
        for(int i=0;i<m;i++)
            arr1[i] = nums1[i];
        int[] arr2 = nums2;
        int i=0,j=0;
        for(int p=0;p<m+n;p++){
            if(i==m)
                nums1[p] = arr2[j++];
            else if(j==n)
                nums1[p] = arr1[i++];
            else if(arr1[i]<arr2[j])
                nums1[p] = arr1[i++];
            else
                nums1[p] = arr2[j++];
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 27. 移除元素 (opens new window)

class Solution {
    public int removeElement(int[] nums, int val) {
        int n = nums.length;
        if(n==0)
            return 0;
        int j = 0;
        for(int i=0;i<n;i++){
            if(nums[i]!=val){
                nums[j] = nums[i];
                j++;
            }
        }
        return j;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 26. 删除有序数组中的重复项 (opens new window)

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if(n<2)
            return n;
        int j=1;
        for(int i=1;i<n;i++){
            if(nums[i]!=nums[j-1]){
                nums[j] = nums[i];
                j++;
            }
        }
        return j;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 80. 删除有序数组中的重复项 II (opens new window)

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if(n<3)
            return n;
        int j=2;
        for(int i=2;i<n;i++){
            if(nums[i]!=nums[j-2]){
                nums[j] = nums[i];
                j++;
            }
        }
        return j;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 122. 买卖股票的最佳时机 II (opens new window)

# 274. H 指数 (opens new window)

# 380. O(1) 时间插入、删除和获取随机元素 (opens new window)

# 134. 加油站 (opens new window)

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        // 全程油量,局部油量(<0起始位置需要改)
        int sum = 0,partSum = 0;
        int start = 0;
        int n = gas.length;
        for(int i=0;i<n;i++){
            sum += gas[i]-cost[i];
            partSum += gas[i]-cost[i];
            if(partSum<0){
                partSum = 0;
                start = i+1;// 能说明前面都不是答案,只能向后继续寻找
            }
        }
        if(sum<0)
            return -1;
        return start;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 135. 分发糖果 (opens new window)

# 13. 罗马数字转整数 (opens new window)

# 12. 整数转罗马数字 (opens new window)

# 58. 最后一个单词的长度 (opens new window)

# 14. 最长公共前缀 (opens new window)

# 151. 反转字符串中的单词 (opens new window)

# 6. Z 字形变换 (opens new window)

# 28. 找出字符串中第一个匹配项的下标 (opens new window)

# 68. 文本左右对齐 (opens new window)

# 双指针

# 125. 验证回文串 (opens new window)

# 392. 判断子序列 (opens new window)

# 167. 两数之和 II - 输入有序数组 (opens new window)

# 滑动窗口

# 209. 长度最小的子数组 (opens new window)

# 30. 串联所有单词的子串 (opens new window)

# 矩阵

# 36. 有效的数独 (opens new window)

# 289. 生命游戏 (opens new window)

# 哈希表

# 383. 赎金信 (opens new window)

# 205. 同构字符串 (opens new window)

# 290. 单词规律 (opens new window)

# 242. 有效的字母异位词 (opens new window)

# 202. 快乐数 (opens new window)

# 219. 存在重复元素 II (opens new window)

# 区间

# 228. 汇总区间 (opens new window)

# 57. 插入区间 (opens new window)

# 452. 用最少数量的箭引爆气球 (opens new window)

# 栈

# 71. 简化路径 (opens new window)

# 150. 逆波兰表达式求值 (opens new window)

# 224. 基本计算器 (opens new window)

# 链表

# 92. 反转链表 II (opens new window)

为什么需要构造dummy节点?

当节点个数为1时或l=1时,p0节点没有指向;

class Solution {
    public ListNode reverseBetween(ListNode head, int l, int r) {
        ListNode dummy = new ListNode(-1,head);
        ListNode p = dummy;
        for(int i=0;i<l-1;i++)
            p = p.next;
        ListNode pre = null,cur = p.next;
        for(int i=0;i<r-l+1;i++){
            ListNode nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        p.next.next = cur;
        p.next = pre;
        return dummy.next;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 82. 删除排序链表中的重复元素 II (opens new window)

方法一:递归

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        // 没有节点或者只有一个节点,必然没有重复元素
        if(head==null || head.next==null)
            return head;
        // 不同则head保留
        if(head.val!=head.next.val){
            head.next = deleteDuplicates(head.next);
            return head;
        }else{
            // 找到不重复的值,返回对不重复节点的递归结果
            ListNode notDup = head.next.next;
            while(notDup!=null && notDup.val==head.val)
                notDup = notDup.next;
            return deleteDuplicates(notDup);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

方法二:一次遍历

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head==null || head.next==null)
            return head;
        ListNode dummy = new ListNode(-1,head);
        ListNode pre = dummy;
        ListNode cur = head;
        while(cur!=null){
            while(cur.next!=null && cur.next.val==cur.val)
                cur = cur.next;  
            if(pre.next==cur)
                pre = pre.next;
            else
                pre.next = cur.next;
            cur = cur.next;
        }
        return dummy.next;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 61. 旋转链表 (opens new window)

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head==null || k==0)
            return head;
        int n = 0;
        ListNode tail = head;
        for(ListNode p = head;p!=null;p = p.next){
            tail = p;
            n++;
        }
        k %= n;
        ListNode p = head;
        for(int i=0;i<n-k-1;i++)
            p = p.next;
        tail.next = head;
        head = p.next; //p.next为分割后段的头节点
        p.next = null; //p为分割前段的尾节点
        return head;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 86. 分隔链表 (opens new window)

class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode dummy1 = new ListNode(-1);// <=x部分
        ListNode dummy2 = new ListNode(-1);// >x部分
        ListNode p1=dummy1,p2=dummy2;
        ListNode p = head;
        while(p!=null){
            if(p.val>=x){
                p2.next = p;
                p2 = p2.next;
            }else{
                p1.next = p;
                p1 = p1.next;
            }
            // 断开原链表中每个节点的next指针
            ListNode tmp = p.next;
            p.next = null;
            p = tmp;
        }
        // 两部分连接
        p1.next = dummy2.next;
        return dummy1.next;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 二叉树

# 100. 相同的树 (opens new window)

# 106. 从中序与后序遍历序列构造二叉树 (opens new window)

# 117. 填充每个节点的下一个右侧节点指针 II (opens new window)

# 129. 求根节点到叶节点数字之和 (opens new window)

# 112. 路径总和 (opens new window)

# 173. 二叉搜索树迭代器 (opens new window)

# 222. 完全二叉树的节点个数 (opens new window)

# 637. 二叉树的层平均值 (opens new window)

# 103. 二叉树的锯齿形层序遍历 (opens new window)

# 530. 二叉搜索树的最小绝对差 (opens new window)

# 427. 建立四叉树 (opens new window)

# 图

# 130. 被围绕的区域 (opens new window)

# 133. 克隆图 (opens new window)

# 399. 除法求值 (opens new window)

# 210. 课程表 II (opens new window)

# 909. 蛇梯棋 (opens new window)

# 433. 最小基因变化 (opens new window)

# 127. 单词接龙 (opens new window)

# 字典树

# 211. 添加与搜索单词 - 数据结构设计 (opens new window)

# 212. 单词搜索 II (opens new window)

# 回溯

# 52. N 皇后 II (opens new window)

# Kadane算法

# 53. 最大子数组和 (opens new window)

# 918. 环形子数组的最大和 (opens new window)

# 堆

# 373. 查找和最小的 K 对数字 (opens new window)

# 502. IPO (opens new window)

# 位运算

# 67. 二进制求和 (opens new window)

# 190. 颠倒二进制位 (opens new window)

# 191. 位1的个数 (opens new window)

# 137. 只出现一次的数字 II (opens new window)

# 201. 数字范围按位与 (opens new window)

# 数学

# 9. 回文数 (opens new window)

# 66. 加一 (opens new window)

# 172. 阶乘后的零 (opens new window)

# 69. x 的平方根 (opens new window)

# 50. Pow(x, n) (opens new window)

# 149. 直线上最多的点数 (opens new window)

# 动态规划

# 120. 三角形最小路径和 (opens new window)

# 63. 不同路径 II (opens new window)

# 97. 交错字符串 (opens new window)

# 123. 买卖股票的最佳时机 III (opens new window)

# 188. 买卖股票的最佳时机 IV (opens new window)

# 221. 最大正方形 (opens new window)

hot100
剑指offer(针对hot100补充)

← hot100 剑指offer(针对hot100补充)→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式