leetcode做题笔记
leetcode做题笔记
biienu
英雄不问出路 做人要有风度
展开
-
埃氏筛算法(素数筛选法)
埃氏筛算法: 用于在一定范围内找出所有素数的算法,基本思想为从小到大遍历,将素数的所有位数都标记为合数,剩余的数都是素数。原创 2024-02-28 21:01:55 · 442 阅读 · 0 评论 -
矩形重叠问题
对于x轴上的投影线段rec1(x1,x2), rec2(x1,x2)和y轴上的投影线段rec1(y1,y2),rec2(y1,y2),如果两组线段都相交,则说明两个矩形重叠。输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]输入:rec1 = [0,0,1,1], rec2 = [2,2,3,3]如果rec1在rec2的左侧,则rec1的x2原创 2023-08-19 14:48:55 · 461 阅读 · 1 评论 -
1475.商品折扣后的最终价格
leetcode原题链接。原创 2023-08-14 20:48:22 · 126 阅读 · 0 评论 -
数字的补数
/ 整数n的二进制长度,如4(100)的二进制长度为3。c = 7(111)。此时得到n的二进制中第一位都为1的数为c。4(100),则v = 8(1000)。对整数的二进制位取反操作,再转成十进制得到该整数的补数。如 4(100) 取反后得到补数3(011)。获取n的二进制位中每一位都为1的数c。将 c 与 n进行异或。对于整数n = 4。原创 2023-08-06 12:04:00 · 132 阅读 · 0 评论 -
239.滑动窗口最大值
已不是窗口中的元素,但9依然在队列中,且9为队列的队头元素,需要将9从队列的队头弹出。由队尾到队头 元素是单调递增的。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。初始时,窗口为1,队列中元素为9, 8, 7。窗口向右移动时(窗口2)发现。:队列中的元素是单调递增或单调递减的队列就是单调队列。滑动窗口每次只向右移动一位。对于这道题需要维护一个单调递增的队列。原创 2023-07-27 18:11:56 · 218 阅读 · 0 评论 -
918.环形子数组的最大和
结尾的最大子数组的和,所以dp[i] = dp[i - 1] + nums[i], 但是nums[i] 如果比dp[i - 1] + nums[i]还要大,那dp[i] = nums[i], 所以 dp[i] = Math.max(dp[i - 1] + nums[i], nums[i])。我们需要记录[0, i] 区间的最大值,这个区间是从0开始的,比方说[0, 2]区间的最大值为10,如果[0, 3]区间的和小于10,那么[0, 3]区间的和为[0, 2]区间的和。结尾的最大子数组的和。原创 2023-07-20 15:00:50 · 108 阅读 · 0 评论 -
计算自然数的表达式
计算自然数的表达式原创 2022-11-07 23:26:03 · 168 阅读 · 0 评论 -
43.字符串相乘
43.字符串相乘涉及到的相关题目:415.字符串相加题目描述:解法:竖式相加:num1 为乘数,num2为被乘数。num1与num2的每一位相乘之后再相加。注意补 0 操作代码:class Solution { public String multiply(String num1, String num2) { StringBuilder sb = new StringBuilder(); int len1 = num1.len原创 2022-04-23 23:47:14 · 435 阅读 · 1 评论 -
386.字典序排数
386.字典序排数题目描述:解法:回溯/深度优先搜索回溯回溯代码:class Solution { public List<Integer> lexicalOrder(int n) { backtrack(n); return rest; } List<Integer> rest = new ArrayList<>(); StringBuilder sb = new StringBuilde原创 2022-04-19 23:15:08 · 76 阅读 · 0 评论 -
819.最常见的单词
819.最常见的单词题目描述:解法:求出段落中所有的单词代码:class Solution { public String mostCommonWord(String paragraph, String[] banned) { String rest = ""; //函数返回值 paragraph = paragraph.toLowerCase(); //转为小写 int pre = 0; // paragraph.substrin原创 2022-04-17 23:50:01 · 117 阅读 · 0 评论 -
72.编辑距离
72. 编辑距离题目描述:解法:动态规划动态规划解题主要步骤:确定dp数组以及下标含义推出递推公式初始化确定遍历顺序本题分析如下 :确定dp数组以及下标含义:dp[1] [j] 表示 [0, i - 1]的word1 和 [0, j - 1] 的word2的最小编辑操作为dp[i] [j]递推公式:(1) 如果 word1[i - 1] == word2[j - 1] 相等的话就什么也不用操作了,则dp[i] [j] = dp[i - 1] [j - 1](2) 如果原创 2022-04-16 11:26:09 · 671 阅读 · 0 评论 -
70爬楼梯
文章目录70. 爬楼梯 - 力扣题目描述:解法:动态规划爬楼梯规则:每次只能爬 1 或 2 个台阶,也就是说, 爬到第 i 阶是由第i - 1 和 i - 2 组成也可以通过推导找出规律:第1阶: 1 共 1 种第2阶: 1 + 1, 2, 共2种第3阶: 1 + 1 + 1, 1 + 2, 2 + 1, 共3种。。。。。。可以发现: 第 i 阶 = 第 i - 1 阶 + 第 i - 2 阶所以 我们只需知道 i = 1,和 i = 2时的值,就可以求出后面所有的。原创 2022-04-15 23:24:58 · 128 阅读 · 0 评论 -
41. 缺失的第一个正数
41. 缺失的第一个正数题目描述:解法:基于排序/Map排序:升序排列后,很容易找到第一个缺失的正数。代码:class Solution { public int firstMissingPositive(int[] nums) { Arrays.sort(nums); int len = nums.length; int i = 0; while(i < len){ if(nums[原创 2022-04-12 23:13:59 · 139 阅读 · 0 评论 -
53.最大子数组和
53.最大子数组和文章目录解法:动态规划优化题目描述:解法:动态规划动态规划主要解题步骤:确定dp数组以及下标含义根据dp数组推出状态转移方程初始化dp数组确定遍历顺序本题动态规划分析过程:dp[i] 表示 下标 i 结尾的最大连续和。如果 dp[i - 1] > 0 的话,dp[i] = nums[i] + dp[i - 1];如果dp[i - 1] < 0,dp[i] 就没必要再加上dp[i - 1]了,因为加上dp[i - 1]只会使dp[i] 变小,原创 2022-04-12 08:15:33 · 141 阅读 · 0 评论 -
6038. 向表达式添加括号后的最小结果
6038. 向表达式添加括号后的最小结果题目描述:解法:遍历求解最小即可class Solution { public String minimizeResult(String expression) { int len = expression.length(); //+位置 int mid = expression.indexOf("+"); // lL,rL分别为'('和')'的插入位置 int lL原创 2022-04-10 23:48:33 · 231 阅读 · 0 评论 -
6037. 按奇偶性交换后的最大数字
6037. 按奇偶性交换后的最大数字题目描述:解法:分别记录奇数、偶数,然后排序,最后将奇数、偶数放到合适位置class Solution { public int largestInteger(int num) { List<Integer> odd = new ArrayList<>();//记录偶数元素 List<Integer> even = new ArrayList<>();//记录奇数元素原创 2022-04-10 23:36:00 · 289 阅读 · 0 评论 -
6039. K 次增加后的最大乘积
6039. K 次增加后的最大乘积题目描述:解法:优先队列问题:将k增加到数组中,数组中的总和不变,求乘积最大???想象一下:a + b = n(a > 0, b > 0),求a 乘 b最大,a2 + b2 + 2ab = n2 ,当且仅当 a == b时,a 乘 b 最大。如: a + b = 4, 所有的可能结果有:a = 1, b = 3 ab = 3a = 2, b = 2 ab = 4a = 3, b = 1 ab = 3整体思路:将 k 分配到最小的原创 2022-04-10 22:48:22 · 212 阅读 · 0 评论 -
23.合并 K 个升序链接
leecode题目链接题目描述:解法:分治思想分治–>先分再合并。将链表数组分成 length 个单链表,然后两两合并(合并两个升序链表), 最终完成整个数组的合并(一个升序的链表)。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int原创 2022-04-07 23:35:32 · 533 阅读 · 0 评论 -
35.搜索旋转排序数组
35.搜索旋转排序数组题目描述:解法:二分法排序数组旋转后依然可以使用二分法。使用二分法可以满足O(logn)的时间复杂度。下图:二分法中最重要的一步, 判断nums[mid]与target的关系。看图说话:垂直线左边的最小的数肯定 >= 垂直线右边的最大的数。如果能够看出这个特点,此题就可以按二分法进行查找了。if(nums[mid] >= nums[0])。垂直线左边查找。左边是完全升序的。else {右边进行二分查找。}代码:class Solution原创 2022-04-07 23:05:17 · 57 阅读 · 0 评论 -
31.下一个排列
leetcode 题目链接 ---- > 31.下一个排列题目描述:想法:找到下一个比当前大的排列。比当前大的排列可能有很多,这里找的是下一个。更多细节看代码注释代码:class Solution { public void nextPermutation(int[] nums) { int len = nums.length; for(int i = len - 2; i >= 0; i--){ int原创 2022-04-07 22:41:52 · 43 阅读 · 0 评论 -
39.组合总和
leetcode题目链接题目描述:解法:回溯回溯三个步骤:确定回溯函数返回值(通常是 void),及参数。终止条件。单层遍历逻辑。本题分析如下 :1.回溯函数返回值 void,参数需要 int[] nums, int target, int index, int sum;index 是每次遍历开始位置,因为本题表示每个nums[i]可以被重复利用。sum 表示当前和。2.递归终止条件:当 sum > target,return。当 sum == target 时,添原创 2022-04-07 22:22:37 · 66 阅读 · 0 评论 -
34.在排序数组中查找元素的第一个和最后一个位置
leetcode题目链接: 34.在排序数组中查找元素的第一个和最后一个位置题目描述:解法:二分法三种常用的二分法模板分析因为数组元素是有序的,利用二分查找可以做到Olog(n)的时间复杂度。查找 >= target (开始位置)查找 target + 1(结束位置)代码:class Solution { public int[] searchRange(int[] nums, int target) { int right = n原创 2022-04-06 23:32:32 · 252 阅读 · 0 评论 -
并查集基础模板
并查集可以解决的问题?主要就是集合问题,两个节点在不在一个集合,也可以将两个节点添加到一个集合中。 并查集基础模板:int n = 100, father[] = new father[n]; // n 表示节点数量//初始化并查集void init(){ for(int i = 0; i < n; i++){ father[i] = i; }}//并查集找根int find(int u){ return u == father[u] ? u : father[u]原创 2022-04-06 23:12:30 · 64 阅读 · 0 评论 -
21.合并两个有序链表
leetcode原题链接题目描述:解法:模拟声明一个 dumpnode(哨兵节点)用于返回最终的链表。ListNode temp = dumpnode;比较 list1 和 list2 的 val。while(list1 != null && list2 != null){ if(list1.val < list2.val) { temp.next = list1; list1 = list.next; temp.next = null; // 此处截断原创 2022-04-05 22:44:51 · 1059 阅读 · 0 评论 -
20.有效的括号
leetcode题目链接题目描述:解法:栈每当遇到左括号,就把这个左括号放入栈中,每当遇到右括号时,首先要判断栈是否为空,如果为空说明无效,如果不为空,就拿栈顶元素与当前右括号进行匹配,判断是否有效。栈顶元素和右括号匹配时我们可以用一个Map作为映射关系。map.put( ‘(’ , ‘)’ );map.put( ‘{’ , ‘}’ );map.put( ‘[’ , ‘]’ );代码:class Solution { public boolean isValid原创 2022-04-04 23:34:03 · 416 阅读 · 0 评论 -
1584.连接所有点的最小费用(最小生成树)
leetcode题目链接文章目录Kruskal算法Prim算法。题目描述:解法:最小生成树常见的最小生成树求法有两种: Prim算法、 Kruskal 算法Kruskal算法主要思想是 贪心。首先构建表示边的图,根据边的权值进行排序。不断的选择和判断最终找到一个最小生成树。具体请看代码://kruskal算法//此类用于表示边class Edge{ int len, a, b; Edge(int len, int a, int b){ thi原创 2022-04-03 14:52:32 · 598 阅读 · 0 评论 -
19.删除链表的倒数第N个结点
leetcode题目链接题目描述:解法:1.双指针 2. 遍历节点个数双指针:fast 指针先走 n 个结点,然后slow和fast 一直走,直到fast.next为空(到达最后一个结点),此时 fast - slow == n, 所以slow 指向倒数第 N + 1个结点。删除slow 后面的结点(倒数第N个)代码:/** * Definition for singly-linked list. * public class ListNode { * int val;原创 2022-04-02 09:35:32 · 1453 阅读 · 0 评论 -
17. 电话号码的组合(回溯)
leetcode题目链接题目描述:解法:回溯通过一个数组来映射数字和字符串。代码:class Solution { public List<String> letterCombinations(String digits) { rest.clear(); if(digits.length() == 0) return rest; backtrack(digits, 0); return rest;原创 2022-04-02 09:07:21 · 84 阅读 · 0 评论 -
15.三数之和(排序+双指针)
leetcode 题目链接题目描述:解法:排序 + 双指针、二分法排序 + 二分法:题目要求:三元组不能重复:所以要去重(排序),例如:数组arr: [1,1,1,2,2,2,-3,-3,-3] ,只有[1,2,-3]这一组。首先找到两个不重复的数arr[2], arr[5], 然后在区间[6, 8] 找第三个符合要求的数。因为整个数已经排序,所以在寻找第三个数时可以用二分查找。代码://排序 + 二分法class Solution { public List<Lis原创 2022-04-01 11:21:01 · 791 阅读 · 0 评论 -
5.最长回文子串(动态规划)
leetcode 题目链接 :https://leetcode-cn.com/problems/longest-palindromic-substring/相关题目: 回文子串题目描述:解法:动态规划动态规划 做题 三个步骤:确定dp数组 以及下标含义根据数组下标含义推出状态转移方程确定遍历顺序此题按这三个步骤的分析如下:dp[i][j] 表示区间[i, j] (闭区间) 是否回文串(true表示是)主要分析 s[i] 和 s[j]1. s[i] != s[j]dp[i原创 2022-03-31 20:49:45 · 89 阅读 · 0 评论 -
常见排序算法
目录1.冒泡排序2. 选择排序3.插入排序4. 希尔排序5. 归并排序6. 快速排序7. 堆排序1.冒泡排序package com.biienu.sorttest;/** * @Author: biienu * @Date: 2022/3/30 9:43 * 冒泡排序 */public class BubbleSort { public static void main(String[] args) { int[] temp = {2,1,0,-1, 10,-10}原创 2022-03-30 23:09:54 · 65 阅读 · 0 评论 -
3.无重复字符的最长子串
题目描述:思路:滑动窗口:代码:class Solution { public int lengthOfLongestSubstring(String s) { int max = 0; int len = s.length(); if(len < 2) return len; int left = 0, right = 1; while(right < len){ wh原创 2022-03-29 20:32:54 · 68 阅读 · 0 评论 -
2.两数相加
题目描述:想法:逐位相加即可代码:/** * 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;原创 2022-03-28 09:53:47 · 53 阅读 · 0 评论 -
1.两数之和
问题描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案eg1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。eg2:输入:nums = [3,2,4], target原创 2022-03-28 00:16:49 · 68 阅读 · 0 评论 -
二分查找模板分析
三种模板数据已按升序排序模板一:查找条件不与左右元素进行比较left = 0, right = length - 1;while(left <= right){ mid = left - (right - left) / 2; if(nums[mid] == target){ return mid; } else if(nums[mid] > target){ right = mid - 1; } else { left = mid + 1; }}原创 2022-03-13 17:58:13 · 340 阅读 · 0 评论