算法题重温记录

Zesari 发布于 21 天前 153 次阅读


之前25年初第一次刷完了算法题,后面从四月份开始搞论文,就没有再摸过,记录一下吧

2025.11.18 -- 6题

704. 二分查找 - 力扣(LeetCode) 大一时候的噩梦,考虑好边界条件就没事

35. 搜索插入位置 - 力扣(LeetCode) 二分变体,用时 07:00

晚上去吃涮羊肉喝了一点,晕晕的,21:21继续写

69. x 的平方根 - 力扣(LeetCode) 二分变体,用时 27:39,涉及int和long的区别

Java中:最小值是 -2,147,483,648(-2^31),最大值是 2,147,483,647(2^31 - 1);

我的错误代码:当x=2147395599时,num*num大于int上限,溢出后变成了一个负数,负数永远小于x,所以l一直加,mid一直变大,num一直变大,num*num一直是负数,死循环,超时

// 错误代码:
class Solution {
    public int mySqrt(int x) {
        int l = 0;
        int r = x;

        while (l <= r) {
            int mid = (l + r) / 2;
            int num = mid + 1;
            if (num * num == x) {
                return num;
            } else if (num * num > x) {
                r = mid - 1;
            } else if (num * num < x) {
                l = mid + 1;
            }
        }

        return l;
    }
}


正确的做法是用long类型承接num*num

class Solution {
    public int mySqrt(int x) {
        int l = 0;
        int r = x;

        while (l <= r) {
            int mid = (l + r) / 2;
            long num = mid + 1;
            if (num * num == x) {
                return (int) num;
            } else if (num * num > x) {
                r = mid - 1;
            } else if (num * num < x) {
                l = mid + 1;
            }
        }

        return l;
    }
}

367. 有效的完全平方数 - 力扣(LeetCode) 二分变体,用时 9:32,和上一题一样

27. 移除元素 - 力扣(LeetCode) 第一次做的时候新创了一个ArrayList用于存放nums中非val的值,最后再放回。实际这个题是想让人用双指针,用时3:49。一个记录左边更新位置,一个记录右边遍历位置。

26. 删除有序数组中的重复项 - 力扣(LeetCode) 双指针变体,用时5:04

283. 移动零 - 力扣(LeetCode) 双指针变体,用时5:08

之前25年初第一次刷完了算法题,后面从四月份开始搞论文,就没有再摸过,记录一下吧

2025.11.19 -- 3题

844. 比较含退格的字符串 - 力扣(LeetCode) 第一遍用ArrayList当栈做,双指针变体,但是感觉没必要折磨自己

977. 有序数组的平方 - 力扣(LeetCode) 温习一下Arrays.sort()和冒泡算法

209. 长度最小的子数组 - 力扣(LeetCode) 子数组用滑动窗口做,先定end再定start

2025.11.26 -- 4题

前些天在搞论文,今天继续,要准备面试,所以做些面经手撕题

🐱‍💻面经:一个上午速通华为三面,接下来泡池子 - 小红书 (后来发现这是博士面经 ... ... )

2025.11.27 -- 6题

🐱‍💻面经 - 小红书

64. 最小路径和 - 力扣(LeetCode) dp,好写

20. 有效的括号 - 力扣(LeetCode) Stack<Character> st = new Stack<Character>();

59. 螺旋矩阵 II - 力扣(LeetCode) 这个简单,用时20分钟

54. 螺旋矩阵 - 力扣(LeetCode) 这个令人不适,因为不是正方形矩阵。m和n不相等的情况需要单独拿出来,最后把中间那一行或一列再加入到result数组中(代码随想录上数组6临接矩阵这里不用做了)

443. 压缩字符串 - 力扣(LeetCode) 双指针,其中read指针每轮会后移多次,所以建议用while

1456. 定长子串中元音的最大数目 - 力扣(LeetCode) 滑动窗口

2025.11.28 -- 2题

451. 根据字符出现频率排序 - 力扣(LeetCode) 学习一下内置函数用法

1985. 找出数组中的第 K 大整数 - 力扣(LeetCode) 用BigInteger转字符串大数字,记得import java.math.*,这个题

2025.12.5 -- 7题

58. 区间和(第九期模拟笔试) 前缀和

44. 开发商购买土地(第五期模拟笔试) 二维前缀和

77. 组合 - 力扣(LeetCode) 回溯,假如path是LinkedList或ArrayList,在List<List<Integer>>的result中加入path:result.add(new ArrayList<>(path)); 一定要new ArrayList<>()

216. 组合总和 III - 力扣(LeetCode) 在回溯函数的return中加上一个和的判断即可

17. 电话号码的字母组合 - 力扣(LeetCode) StringBuffer append deleteCharAt

39. 组合总和 - 力扣(LeetCode) 做出来有一点运气成分,本题关键在startIndex的设置上

40. 组合总和 II - 力扣(LeetCode) 去重这里的逻辑没有想通,实际就是排序后当前元素如果和上一个值相同,且上一个元素没有被使用,则说明当前元素开始走上一个元素的老路了

2025.12.6 -- 29题

131. 分割回文串 - 力扣(LeetCode) 截取startIndex到i之间这段区间

93. 复原 IP 地址 - 力扣(LeetCode) 一个道理,不难 【回溯做了前十个】

144. 二叉树的前序遍历 - 力扣(LeetCode) 数组转字符串就用Arrays.toString(arr)

102. 二叉树的层序遍历 - 力扣(LeetCode) 我就用递归了先

107. 二叉树的层序遍历 II - 力扣(LeetCode) 对上一题的结果Collections.reverse(result)

199. 二叉树的右视图 - 力扣(LeetCode) 层序遍历变体

637. 二叉树的层平均值 - 力扣(LeetCode) Double tempSum = 0.0

429. N 叉树的层序遍历 - 力扣(LeetCode) 现在不仅只有left right了,所以递归函数中要用for遍历每个孩

515. 在每个树行中找最大值 - 力扣(LeetCode) Collections.max()

116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode) 这次grid中存的是node

117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode) 和上一个题做法一模一样,层序遍历管你是什么二叉树

104. 二叉树的最大深度 - 力扣(LeetCode) grid的大小

111. 二叉树的最小深度 - 力扣(LeetCode) 递归终止条件中加入对当前节点是叶的判断,随后比较深度

226. 翻转二叉树 - 力扣(LeetCode) 创建临时节点,交换left right

101. 对称二叉树 - 力扣(LeetCode) 递归,left.left right.right

222. 完全二叉树的节点个数 - 力扣(LeetCode) 还是层级好用

110. 平衡二叉树 - 力扣(LeetCode) 嗯嗯竟然做出来了

257. 二叉树的所有路径 - 力扣(LeetCode) 感觉做递归还是稍微稀里糊涂

404. 左叶子之和 - 力扣(LeetCode) 一般

203. 移除链表元素 - 力扣(LeetCode) 你是要跳过当前这个还是直接到下一个

206. 反转链表 - 力扣(LeetCode) fakeNode

24. 两两交换链表中的节点 - 力扣(LeetCode) 最关键的是那个切换next的逻辑顺序

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 就是先获取整个链表长度

面试题 02.07. 链表相交 - 力扣(LeetCode) 链表迭代可以直接判断ptr和null是否相等,不是非要ptr.next

142. 环形链表 II - 力扣(LeetCode) 哈希表很简单。我一直记着这个题的快慢指针做法,是因为最开始用TS写这个题

242. 有效的字母异位词 - 力扣(LeetCode) Java哈希表有一个陷阱,当当前键对应的值太大,超过 -128~127 缓存范围,如:Integer a = 200;HashMap返回的是 Integer对象,使用 !=比较的是对象引用,而不是数值。所以应该用equals。实际上这个题最好用把字符串拆成字符数组,然后排序,比较字符数组是否相等。s.toCharArray() Arrays.sort() Arrays.equals(str1, str2)

349. 两个数组的交集 - 力扣(LeetCode) <>中类型应该为泛型,Boolean

202. 快乐数 - 力扣(LeetCode)

1. 两数之和 - 力扣(LeetCode) 不能重复用一个数就判断一下index是否相等

2025.12.7 -- 15题

454. 四数相加 II - 力扣(LeetCode) 两两分组,第一组加入和,第二组找和的相反数

383. 赎金信 - 力扣(LeetCode) 两个哈希表比较每一项的大小

15. 三数之和 - 力扣(LeetCode) 双指针成名之战,定开后,l和r往中间靠拢,注意需要用while跳过之前相同的元素。这个就别拿哈希表了,折磨自己

18. 四数之和 - 力扣(LeetCode)注意ij的重复判断,同时sum的类型用long

long tempSum = (long)nums[i] + nums[j] + nums[left] + nums[right]; 这样正确

long tempSum = nums[i] + nums[j] + nums[left] + nums[right]; 这样错误,先四个int计算,已经溢出,是把溢出的结果给了tempSum

344. 反转字符串 - 力扣(LeetCode) ez

541. 反转字符串 II - 力扣(LeetCode) char[] c 转String:new String(c)

54. 替换数字(第八期模拟笔试) StringBuffer sb = new StringBuffer(); sb.toString(); sb.append();

151. 反转字符串中的单词 - 力扣(LeetCode) 内置函数题,

String s = " hello ";

String s = s.trim();

// 按照空格分隔,包括多个连续空格

String[] wordList = s.trim().split("\\s+");

// 把String[]转为List,随后倒叙

List<String> ans = new ArrayList<>(wordList);

// 用Collections.reverse()倒序

Collections.reverse(ans);

// 把List<String>中每一项连接起来

String.join(" ", wordList)

55. 右旋字符串(第八期模拟笔试) java字符串截取:s.substring

如果输入张这样,则下面的2后的换行符需要消耗

2
abcdefg
abcdefgbb

    // 读取第一行:数字
    int n = scanner.nextInt();
    scanner.nextLine();  // 读取数字后的换行符

    // 读取接下来的字符串
    String[] strings = new String[n];
    for (int i = 0; i < n; i++) {
        strings[i] = scanner.nextLine();
    }

28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode) ez

27. 移除元素 - 力扣(LeetCode) ez

20. 有效的括号 - 力扣(LeetCode)

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode) List<Character>中每一个字符连接成字符串就用for吧

150. 逆波兰表达式求值 - 力扣(LeetCode) java字符串比较不能用==,要用equals。Stack就peek pop push

239. 滑动窗口最大值 - 力扣(LeetCode) 双端队列,Deque<Integer> q = new LinkedList<>(); 自定义一个队列,队列头最大,降序排列

2025.12.8 -- 题

455. 分发饼干 - 力扣(LeetCode) 小孩吃小的,大孩儿吃大的

2410. 运动员和训练师的最大匹配数 - 力扣(LeetCode) 和上题一样

376. 摆动序列 - 力扣(LeetCode) 这个题就贼离谱,边界条件不好处理,是因为一直在想前面的差和后面的差,实际就想现在是该上升还是该下降就好了,还很简单,很好理解

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length == 1) {
            return 1;
        }

        boolean up = true;
        boolean down = true;
        int result = 1;

        for (int i = 1; i < nums.length; i ++) {
            if (up && nums[i - 1] < nums[i]) {
                up = false;
                down = true;
                result ++;
            } else if (down && nums[i - 1] > nums[i]) {
                up = true;
                down = false;
                result ++;
            }
        }

        return result;
    }
}

53. 最大子数组和 - 力扣(LeetCode) 用dp做的,dp[i]为以nums[i]为结尾的子数组的最大和,从dp[i-1]+nums[i]和num[i]中选择更大的。贪心的思想是反正我都是负的了,就不能把负数再传递下去,当然我已经记录了之前达到的最大值

122. 买卖股票的最佳时机 II - 力扣(LeetCode) 因为可以同一天多次卖卖该股票,所以就是累加正的差

55. 跳跃游戏 - 力扣(LeetCode) 之前做不对是因为没办法正确描述代码逻辑,思路对的,就是没想到能让cover动态变大

45. 跳跃游戏 II - 力扣(LeetCode) 这两个条约游戏都很狡猾,遍历上限都是要及时调整的

1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 情况考虑完善

134. 加油站 - 力扣(LeetCode)不要被这个循环迷惑。怪题,如果tempSum < 0,清空tempSum,然后start = i + 1,不要被这个循环迷惑

😅135. 分发糖果 - 力扣(LeetCode) 没营养的困难,哪有什么思路,随看随记吧

860. 柠檬水找零 - 力扣(LeetCode) 模拟题,列出所有情况

2025.12.9 -- 题

😅 406. 根据身高重建队列 - 力扣(LeetCode) 先确定身高,随后按照第二项在对应的索引插入。

List<int[]> res = new ArrayList<>(); res.toArray(int[res.length][2]); int[res.length][2] 是给数组定型

452. 用最少数量的箭引爆气球 - 力扣(LeetCode) 我一直在想怎么解决a和b重叠,b和c重叠,但是a和c不重叠的情况,实际可以让b的end和a一样,这样就不用考虑b和c重叠。这个题就是找有多少个重叠

错误:

// -2147483646 - 2147483646 会溢出 
Arrays.sort(points, (a, b) -> (a[0] - b[0]));

正确:Integer.compare(a, b)

Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));

435. 无重叠区间 - 力扣(LeetCode) 和上一道差不多,减去重叠数剩下就是不重叠

763. 划分字母区间 - 力扣(LeetCode) 记录当前最大范围值,判断是否和i相等,相等则截取这段

56. 合并区间 - 力扣(LeetCode)  如果当前结果中最后一个区间的1大于当前遍历到的区间的0,则合并,设置1为更大的1。否则,就把当前区间加入进去

738. 单调递增的数字 - 力扣(LeetCode) 首先判断原本是否就符合,如果不符合,就倒序遍历,记住需要从该索引向后全置9的索引,同时高一位-1

968. 监控二叉树 - 力扣(LeetCode) 四种情况,递归

509. 斐波那契数 - 力扣(LeetCode) 1

70. 爬楼梯 - 力扣(LeetCode)

2025.12.10 -- 题

746. 使用最小花费爬楼梯 - 力扣(LeetCode)

62. 不同路径 - 力扣(LeetCode)

Hello, It's me.
最后更新于 2025-12-10