力扣
CountingStars619
这个作者很懒,什么都没留下…
展开
-
优先队列总结
优先队列在插入元素的时候,自动将其插入到合适的位置,实现动态的调整,底层是堆。创建优先队列时,可自己实现comparator接口的compare方法,用于队列中的元素排列规则。在使用优先队列时,有时候需要配合排序数组使用,也可以为Arrasy.sort()方法传入一个comparator接口的匿名内部类或lamda表达式,自定义数组排序规则。力扣630. 课程表 III思路:贪心+优先队列。每次选择一个截至时间最早的课程,判断该课程的持续时间与之前课程的持续时间之和是否超过了该课程的截至时间,如果没超过原创 2022-04-08 11:23:01 · 399 阅读 · 0 评论 -
java char与int互转
1.char转int,直接减去’0’2.int 转char,加上+'0’再强转为charint a = (char)(c + '0')原创 2022-03-08 16:47:35 · 406 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数
思路:题目规定时间复杂度为0(n),所以不能使用哈希表,暴力方法。利用异或,二进制位相同位0,不同为1.如果只有一个数字出现一次,则只需要将所有 数字进行异或运算,最后的结果即为该数字,因为出现两次的数字因异或运算两两抵消了。因此,需要将原数字进行分成2组,这两个数字各在一组,相同的数字在一组。具体实现为:先将所有数字进行异或得到res,按res的二进制位为1进行分组,数字的该二进制位为1,在一组,为0在另一组。然后在组内各进行一次异或,即得到结果。代码:class Solution { pub原创 2022-03-04 11:18:16 · 104 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
1.思路:使用动态规划+哈希表。设s[j]为字符串下标j的元素,s[i]为s[j]左边最近的,与s[j]相同的元素,d[j - 1]表示以s[j - 1]结尾的不含重复子串的最大长度。此时分三种情况:1)d[j - 1] > j - i,此时i位于d[j - 1]区间内b c d a e f g a, s[j] = a, s[j - 1] = g2)d[j - 1] = j - i,此时i位于d[j - 1]区间内,是d[j - 1]区间的最左元素。b a d g e f b a, s[j]原创 2022-03-04 10:31:20 · 299 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
思路:使用动态规划,dp[i][j]表示从起点到{i, j}的累计最大礼物价值。所以可以写出状态转移方程:p[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];代码:class Solution { public int maxValue(int[][] grid) { int rows = grid.length; int cols = grid[0].length; int[][] dp原创 2022-03-02 20:53:21 · 71 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
方法1.动态规划思路: //类似青蛙跳台阶的思想,要求前i位的翻译数,第i位可以单独作为一位,此时,前i位的翻译数与前i-1位数的翻译数一致,第i位也可与i-1位组成一个2位数进行翻译,如果可以组合,则前i位的翻译数与前i-2位的翻译数一样,因为后面两位固定只有一种翻译方式如果不可以组合,则这种方式为0种。代码:// class Solution {// public int translateNum(int num) {// String s = String.value原创 2022-03-02 19:36:02 · 108 阅读 · 0 评论 -
HTTP 长连接短连接使用场景是什么
HTTP1.1之前默认使用的是非持久连接,HTTP1.1之后使用的是默认使用持久连接。只要客户端和服务器都设置Connection为keep-alive,就是使用长连接。实际上,是使用TCP长连接,因为http是应用层协议,要tcp是传输层协议,肯定是再客户端和服务器通过三次握手建立tcp连接,才能传输信息。为什么博客园这种用户少的网页也使用长连接,使用长连接不是为了减少频繁的tcp开销吗?事实上,使用长连接的一个好处是可以复用tcp连接,即便是访问客户端较少的博客园,诸如js等文件也需要建立tcp连接,原创 2022-03-01 22:00:19 · 1214 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
1.思路: 使用动态规划,dp[i]表示nums[i]结尾的最大连续数组和,也就是前i个元素的最大连续和是取前i个加上当前元素呢还是,抛弃前i - 1个,从当前元素开始。需要维护一个额外的MaxSum保存中的的子数组的最大和dp[num.length - 1]不是最大和,他代表的仅仅的(dp[nums.length - 2] + nums[length - 1], nums[nums.length - 1])两者的最大值2.代码:class Solution { public int maxSu原创 2022-03-01 19:34:13 · 622 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
方法1:排序思路:先排序,然后返回arr[arr.length / 2]代码:排序class Solution { public int majorityElement(int[] nums) { quickSort(nums, 0, nums.length - 1); return(nums[nums.length / 2]); } public static void quickSort(int[] arr, int start, int原创 2022-03-01 17:12:48 · 156 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
1.思路:使用一个辅助辅助栈,对于pushed中的元素,每次将一个元素入栈,然后栈顶元素和出栈顺序的元素相比,如果相同,则将元素出栈,也就是用在辅助栈上模拟入栈和出栈顺序,最后栈为空,则说明出栈顺序是可行的,否则不行。2代码:class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer> Stack = new Stack();原创 2022-03-01 14:50:51 · 104 阅读 · 0 评论 -
算法中常见各种判断条件
1.数组:matrix == null || matrix.length == 0 || matrix[0].length == 0;2.栈:while(!stack.isEmpty())3.队列:队列为空:rear == front, 队满:(rear + 1) % queaSize = front;4.双指针: while(l < r)原创 2022-03-01 14:28:02 · 215 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈
1.思路:设置两个栈A和B,A存储所有元素,B存储的是小于等于A入栈的第一个元素,且按非递增顺序排列,这就保证了B的栈顶元素是最小元素2.代码:class MinStack { Stack<Integer>A; Stack<Integer>B; /** initialize your data structure here. */ public MinStack() { A = new Stack(); B =原创 2022-03-01 11:39:37 · 61 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
1.思路:模拟顺时针打印的过程,从{0, 0}开始。遍历矩阵,最开始是向右,当row或者col超过下标或者元素已经被访问,则改变访问的方向。2.代码:class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix == null || matrix.length == 0 || matrix[0].length == 0)return new int[0]; //模拟顺时针打印矩阵原创 2022-03-01 10:27:59 · 74 阅读 · 0 评论 -
剑指 Offer 49. 丑数
1.思路://用dp[i]标识第i个丑数,根据丑数的定义,若当前已得到dp[i - 1],则dp[i]只能等于dp[a] * 2, dp[b] * 3, dp[c] * 5中的最小者,a, b,c未知//其中dp[a]是首个乘以2大于dp[i-1],dp[b]是首个乘以3大于dp[i-1],dp[c]是首个乘以5大于dp[i-1]的丑数2.代码:class Solution { public int nthUglyNumber(int n) {//用dp[i]标识第i个丑数,根据丑数的定义原创 2022-02-25 16:04:04 · 140 阅读 · 0 评论 -
【无标题】
1.思路:使用快速幂,将x的a次方的值数a转换为2进制的形式,即x ^ a = x^ (1 * b1) * x^ (2 * b2) * x^ (4 * b3) * …,bi为0或者12.代码:class Solution { public double myPow(double x, int n) { if(n == 0) return 1; double res = 1.0; //当n为负数时,例如2的-3,做法是将2变为小数,-3变为正3,由于原创 2022-02-22 17:05:48 · 76 阅读 · 0 评论 -
剑指 Offer 15- 二进制中1的个数
1.思路:方法1是利用求整数的二进制的方法,每次加上n %2,再将n / 2。直到n == 0;疑惑的地方在于java通不过部分测试案例,c++则可以。方法2是利用与运算逐个比较n的每个二进制位,为1则count++;2.代码://编译不通过,c++可以// public class Solution {// // you need to treat n as an unsigned value// public int hammingWeight(int n) {//原创 2022-02-22 15:14:33 · 395 阅读 · 0 评论 -
剑指Offer14-II-剪绳子
1.思路:本题是在I的基础上做了限定,要求结果求余,所以不能再用动态规划。根据数学证明,绳子剪成多短,每段为3时乘积最大。设n 为绳子长度,n = x * a + b,即将绳子剪为a段,每段x长,余b。b可取0, 1, 2。需要注意的是,b为1时,可以和一个3凑成2 和2,这样乘机会更大。2.代码:class Solution { public int cuttingRope(int n) { if(n < 4) return n - 1; long res原创 2022-02-22 14:10:14 · 54 阅读 · 0 评论 -
剑指Offer14-剪绳子
1.思路:使用动态规划,dp[i]表示长度为i的绳子可以剪的最长长度,动态转移方程为dp[i] = max(dp[i], max(j * i, j * dp[i - j]))。2.代码:class Solution { public int cuttingRope(int n) { //dp[i]表示长度为i剪成m段的最长长度 int[] dp = new int[n + 1]; //长度为2剪成2段 dp[2] = 1;原创 2022-02-22 12:48:53 · 367 阅读 · 0 评论 -
剑指offer13-机器人的运动范围
1.思路:使用广度优先遍历,使用队列存储元素,将当前元素出队,依次访问该元素的周边元素,如果符合条件则记作以访问,并将其入队,总数加1,从而实现广度优先。当队列为空时,则结束访问,返回总数。2.代码:class Solution { public int movingCount(int m, int n, int k) { if(k == 0)return 1; //标记当前格子是否访问过,访问过为1 int[][] vis = new int[m]原创 2022-02-21 18:07:31 · 188 阅读 · 0 评论 -
冒泡排序,选择排序,堆排序,快速排序学习心得
常用排序算法中复杂度为o(n2),o(n log(n)),冒泡和选择为o(n2),堆排序和快速排序为o(n log(n))。1.冒泡排序主要思路:每一趟从第一个数开始,两两比较,如果nums[i] > nums[i + 1],则将两数交换,共比较nums.length - 1趟数。改进版是某一趟没有发生交换,则停止。代码易错点。 boolean swaped = true; for(int i = 0; i < nums.length - 1; i++){ //如果原创 2022-02-18 18:55:28 · 551 阅读 · 0 评论 -
LeetCode430-扁平化多级双向链表
思路:用dfs实现扁平化当前节点的child,并返回扁平化的最后一个节点childLast。如果next不为空,则将next链接在childLast后面。代码:class Solution { public Node flatten(Node head) { dfs(head); return head; } //dfs用于扁平化当前节点作为head的链表,并返回扁平化后的最后一个节点 public Node dfs(Node head)原创 2021-12-13 15:03:43 · 485 阅读 · 0 评论 -
LeetCode328-奇偶链表
思路:思路很简单,将原链表中的奇节点两两连起来,偶数节点两两连起来,再将偶数链表链在奇数链表后边。代码://思路就是拿掉原链表中的偶数节点,链起来,然后将偶数节点的头连在最后一个奇数节点后面。class Solution { public ListNode oddEvenList(ListNode head) { if(head == null) return null; //分别指向奇数节点,偶数节点,偶数节点头 ListNode odd =原创 2021-12-07 20:01:49 · 648 阅读 · 0 评论 -
LeetCode
思路:思路很简单。cur指向前一个节点,cur指向当前节点,利用pre删除当前与val相同值的节点。代码:class Solution { public ListNode removeElements(ListNode head, int val) { ListNode dummyNode = new ListNode(0, head); ListNode pre = dummyNode, cur = pre.next; while (cur !=原创 2021-12-07 14:53:18 · 2870 阅读 · 0 评论 -
LeetCode92-反转链表Ⅱ
思路:思路简单,截断中间链表,反转再拼接。代码:class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { //思路很简单,反转中间部分,再拼接起来。 //为了省去奇奇怪怪的错误,创建一个头节点,避免节点个数太少导致null.next.next ListNode dummyNode = new ListNode(0, head);原创 2021-12-06 20:56:21 · 415 阅读 · 0 评论 -
LeetCode1816-截断句子
方法1:1.思路:最开始想到的是对字符串分割,创建一个空串,将前k个单词拼接起来。2.代码:class Solution { public String truncateSentence(String s, int k) { String[] str = s.split(" "); String res = ""; for (int i = 0; i < k; i++){ if(i == k- 1){原创 2021-12-06 14:56:13 · 81 阅读 · 0 评论 -
LeetCode1446-连续字符
1.思路:题目要求字符串中字母连续出现的最大次数,只需要维护一个ans和一个计数器,如果i和i+1的元素相等,次数加一,并根据条件判断是否更新ans,不相等则将count置为1,重新开始。2.代码:class Solution { public int maxPower(String s) { int count = 1, ans = 1; for (int i = 0; i < s.length() - 1; i++){ if(s.原创 2021-12-01 20:57:01 · 3578 阅读 · 0 评论 -
LeetCode刷题心得
1.溢出问题。LeetCode69 , int mid = l + (r - l + 1) / 2;会溢出,最后的测试用例2147483647, mid+1就超出了int的数据为范围: -2147483648 ~ +2147483647。解决方法:1)c++: int mid = (long long) l + r + 1 >> 2;原创 2021-12-01 20:18:08 · 4096 阅读 · 0 评论 -
LeetCode160-相交链表
1.思路:开始想的是分别用两个hashSet保存两个两个链表的元素,最后返回元素的交集即可。很明显这是错误的想法,题目要求是返回相交的节点。所以,正确的做法是保存一个链表的节点,遍历另外一个链表,遇到元素相同的节点停止,返回该节点即可。2.代码:3.复杂度分析:l42时间复杂度为o(n) + o(n) = o(n),160时间复杂度为o(m+n) 。why?142时间主要消耗在了寻找相遇点和入环点,寻找走的距离没有超过链表长度,所以是0(n)。而相交链表是实打实的要走完链表,所以是0(m+n)。..原创 2021-12-01 18:43:25 · 244 阅读 · 0 评论 -
LeetCode142-环形链表II
1.思路:假设环为顺时针,紫色为相遇点,相遇时fast已经走了n圈,fast速度为slow两倍,则fast走的总距离为:a + b + n(b + c) 由于假设fast速度为slow两倍,则fast走的距离为slow两倍。则有:a + b + n(b + c) = 2(a + b) => (n-1)(b + c) + c = a,也就是说当两个速度相等两个指针p1 p2,p1从起点出发,p2从紫色点出发,一直走,p2走了n-1圈回到了紫色点,再走c的距离到入环点,p1走过距离a也到了入环点,p1和原创 2021-12-01 11:06:38 · 176 阅读 · 0 评论 -
LeetCode141-环形链表
1.思路:使用双指针,如果有环,则fast和slow会在里面打转,并最终相遇,如果没有环,则fast最后会指向null。如果fast还没遇到slow时就一直走,如果fast走到头就返回false,否则直到相遇返回true.错误代码思路是:fast没到头就一直走,有环fast和slow会在环里打转,最终相遇,返回,否则到头结束循环。不知道为啥报空指针异常,焯!2.代码:错误代码:public class Solution { public boolean hasCycle(ListNode he原创 2021-11-30 17:40:24 · 383 阅读 · 0 评论 -
LeetCode561-数组拆分I
1.思路:2n个元素,两两配对,要每组中的最小者累加和最小,那肯定不能让前n个最小的元素分散再每个组,不然每个组中的最小的值就是前n个最小元素之和了,不满足题意,所以应该尽量避免这种情况,怎样才能避免小元素落在了不同组呢,对于排序后的数组,只要将0号元素和1号元素放在一个组,那必然有一个组不包含前n个小元素,这样加起来肯定就大一些,同样的,将3和4号元素再放在一个组,又会出现一个组不包含小元素(排序后的前n个元素),sum又变大了,只要将前面的小元素全部以序放在一起,保证sum就是最小的。至于为啥要排序后依原创 2021-11-22 16:51:15 · 389 阅读 · 0 评论 -
LeetCode151-翻转字符串里的单词
方法11.思路:2.代码:class Solution { public String reverseWords(String s) { //去两头空格 s = s.trim(); //使用空格分割 String[] str = s.split(" "); String res = ""; for(int i = str.length - 1; i >= 0; i--){原创 2021-11-22 10:33:10 · 1467 阅读 · 0 评论 -
LeetCode14-最长公共前缀
1.思路:将所有单词与第1个单词依次比较第k个字母,出现某个单词的长度等于i(该单词下标最多为i-1)或者该单词的字母与第一个单词的第i个字母不相等,则返回首字母的前i-1个字母。2.代码:class Solution { public String longestCommonPrefix(String[] strs) { if(strs == null || strs.length == 0){ return ""; }原创 2021-11-17 19:11:45 · 92 阅读 · 0 评论 -
LeetCode498-对角线遍历。
1.思路。开始想到了将所有对角线按一个方向访问,偶数条翻转。搞错的是list存储中间结果,开始想的是list存数组,但是如何将list后续存入res没想明白,其次是每条对角线的起点没想对。总结起来就是刷题还不够熟练,list用的不熟。求解思路就是将每一条从右上角起到左下角的对角线元素放入res,这样的对角线共行数+列数-1条。2.代码。class Solution { public int[] findDiagonalOrder(int[][] matrix) { if(matr原创 2021-11-15 20:48:30 · 318 阅读 · 0 评论 -
LeetCode-旋转矩阵
方法11.思路:创建新数组copy,将第一行的元素复制到copy最后一列,将第二行的元素复制到copy最后第二列,依次直到最后一行。2.代码:class Solution { public void rotate(int[][] matrix) { int size = matrix.length-1; int[][] copy = new int[size][size]; //将第一行与倒数第一列交换 for (int i =原创 2021-11-11 11:11:21 · 605 阅读 · 0 评论 -
LeetCode56-合并区间
1.思路:需要合并的区间是存在重叠区域的区间,即区间2的左端<=区间1的右端点。用res存储已经合并的区间。将所有区间按左端点排序,如果当前区间的右端点大于res最后一个区间的左端点,即不存在重叠区域,将当前区间放入res,否则根据二者的右端点大小更新最后一个区间的右端点,置为较大者。2.代码:3.复杂度分析:...原创 2021-11-10 20:00:35 · 141 阅读 · 0 评论 -
LeetCode774-寻找数组的中心索引
1.思路:由于存在多个中心索引返回最靠近0号下标的index,所以从左往右遍历数组。中心索引的特点是左右元素相等,换言之,如果i为中心索引,则∑(0,1,2…i-) * 2 + nums[i] = nums.sum()。2.代码:class Solution { public int pivotIndex(int[] nums) { int sum = Arrays.stream(nums).sum(); int s = 0; for (int原创 2021-11-09 19:14:49 · 1662 阅读 · 0 评论 -
LeetCode81-搜索旋转排序数组Ⅱ
1.思路:整个数组分为两部分,+++++++++±---------,由于可能存在重复数组,可能的情况是nums[l]==nums[r]==nums[mid],例如,nums={3,2,3,3,3},此时分不清哪部分是有序的,所有需要先排除掉此种情况。之后查找target可以分为四种情况:1)mid位于左半部,target位于mid左边:++++target+++++++++mid+++++++±-----2)mid位于左半部,target位于mid右边:3)mid位于右半部,target位于mid原创 2021-11-06 20:35:30 · 76 阅读 · 0 评论 -
LeetCode658-找到k个最接近的元素
思路:如果x小于等于首元素,返回前k个元素即可;如果x大于等于尾元素,返回最后k个元素即可;如果x值在数组首元素于为尾元素的值域中间,首先利用二分查找搜索到下的下标或比x大一点的元素下标index,让low= index左边第k-1个元素的下标,high = index右边第k-1个元素的下标,要查找的k个元素一定位于[low, high]。如果左边的元素更接近x,则high–,如果右边的元素更接近x,则low++。代码:class Solution { public List<Integ原创 2021-10-31 15:14:04 · 1836 阅读 · 0 评论 -
二分查找三种模板
1.查找准确值l <= r,l = mid + 1, r = m- 1;2.查找模糊值l < r,l = mid , r = mid - 1;或l = mid + 1, r = mid.3.万用型l < r,l = mid, r = mid;原创 2021-10-27 11:48:13 · 217 阅读 · 0 评论