LeetCode算法实战
量变引起质变,日日精进
小高写BUG
只问耕耘,不问收获。
展开
-
力扣每日一题:兼具大小写的最好英文字母
方式不止这两种,字符型使用1更简便。另外两种字符串方法。原创 2023-01-27 11:43:33 · 183 阅读 · 0 评论 -
力扣每日打卡:二分法+贪心算法
要求数组和小于max,相邻的差小于1,但是要保证num[index]为最大。原创 2023-01-04 22:58:29 · 103 阅读 · 0 评论 -
力扣每日打卡:分割字符串与字符串转数字
发现问题可以使用debug的方法定位问题。原创 2023-01-03 22:17:28 · 89 阅读 · 0 评论 -
力扣每日打卡:优先队列的应用
有序的话就联想到了优先队列。java中PriorityQueue采用的是堆排序,可以根据Comparator来设置排序规则。我一开始的思路是这样的,直接去扫描这个二维数组。或者数量减去抵消数量。b[0]-a[0]为返回值。这里产生了两组判断逻辑。原创 2023-01-02 21:50:20 · 285 阅读 · 0 评论 -
树的最深层叶子节点和
最底层叶子节点和 分层遍历最长用的是BFS。原创 2022-08-17 17:01:48 · 130 阅读 · 0 评论 -
Leetcode算法实战-树的中序遍历和基础回顾(22.5.26)
文章目录2022年5月26日Part 1 算法Part 2 基础回顾AOPLinux命令数据库2022年5月26日Part 1 算法1305. 两棵二叉搜索树中的所有元素middle Level 中级题中的简单题将二叉树转成链表 然后去合并链表class Solution { public List<Integer> getAllElements(TreeNode root1, TreeNode root2) { List<Integer原创 2022-05-26 19:44:46 · 1063 阅读 · 0 评论 -
Leetcode算法实战「最近的请求次数」队列应用
Leetcode算法实战「最近的请求次数」队列应用最近的请求次数leavel:easy题目给了3000的窗口,并且关键信息为 请求t的数值逐渐增大,窗口是不断的右移的,尾部的元素不断被抛弃,先进先出的特点就可联想到队列。class RecentCounter { // 关键信息: 每次对 ping 的调用都使用比之前更大的 t 值。 // 无远虑 有近忧 /** 1 -2999 1 2 -2998 2 窗口为3000 [old last ]原创 2022-05-06 20:14:23 · 1118 阅读 · 0 评论 -
Leetcode1405. 最长快乐字符串(优先队列)
1405. 最长快乐字符串给定a,b,c数量,拼接成没有连续三个元素的字符串。使用优先队列与数组作为数据结构,数组存储数目和字符值package com.firewolf;import java.util.PriorityQueue;public class LongestDiverseString { public String longestDiverseString(int a, int b, int c) { StringBuilder sb = new Str原创 2022-02-07 09:08:08 · 205 阅读 · 0 评论 -
LeetCode栈的应用
文章目录1.Java中栈的使用(目前已不推荐使用)2.Deque双端队列实现栈结构(优先使用)2.1等效方法3。题解为什么用栈这种数据结构解题? 比如上题第二个例子可能存在括号中还有括号的情况,所以先把数字之前的元素先放入栈中,等到取到数字再进行元素计数操作。 所以只有括号出现的时候我们才使用栈来操作,“(”这个字符作为调用栈的信号。1.Java中栈的使用(目前已不推荐使用)栈:后进先出Stack stack = new Stack();//判断Stack是否为空stack.empt原创 2021-12-11 14:53:04 · 506 阅读 · 0 评论 -
链表的深拷贝
文章目录链表1.带随机指针的链表深拷贝1.1.哈希表1.2 原地修改链表 字节等大厂面试的时候可能会要自己写题目要求地方数据结构。// 自己定义链表节点class Node{ int val; Node next; Node random; public Node(int val){ this.val = val; // 进行初始化! this.next = null; this.rando.原创 2021-12-08 20:11:11 · 1431 阅读 · 0 评论 -
二叉树算法题总结
文章目录二叉树集训一、二叉树的基础知识复习1.朴素的DFS深搜二叉树2.翻转二叉树3.判断对称4.广度优先遍历bfs5.二叉树的深度6.num最大子序列7. 是否为子结构8.改造为双向链表9.找和为target路径二、二叉搜索树三、二叉平衡树二叉树集训一、二叉树的基础知识复习前序遍历(根-左-右)中序遍历(左-根-右)后序遍历(左-右-根)671. 二叉树中第二小的节点 二叉树中寻找第二小的节点 如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。 2原创 2021-12-02 21:12:40 · 918 阅读 · 0 评论 -
位运算(腾讯二面)
文章目录Java位运算[剑指 Offer 65. 不用加减乘除做加法](https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/)(腾讯二面)1.n&1(与运算)2.位移操作2.1右移运算符>>2.2左移运算符<<2.3无符号位右移[剑指 Offer 15. 二进制中1的个数](https://leetcode-cn.com/problems/er-jin-zhi-zhong-1d原创 2021-11-15 10:25:06 · 328 阅读 · 0 评论 -
矩阵顺时针遍历
剑指 Offer 29. 顺时针打印矩阵(简单题)这种题已经刷到过不止三遍,出现频率比较高,每刷一次强化一遍思路,并且加快解题速度。矩阵的遍历 数学方法遍历 [ [1,2,3] [4,5,6] [7,8,9] ]输出:[1,2,3,6,9,8,7,4,5]class Solution { int m; int n; public int[] spiralOrder(int[][] matrix) {原创 2021-11-06 16:34:30 · 357 阅读 · 0 评论 -
字符串trim方法与split方法
字符串trim方法和split方法trim 用于删除字符串的头尾空白字符串。返回值为String;public static void main( String[] args ) { String str = " hello world! "; System.out.println(str); System.out.println(str.trim());}/** hello world! hello world!*/split原创 2021-11-03 10:44:01 · 1091 阅读 · 0 评论 -
句子中的有效单词数(20211024周日)
周赛总结5906. 句子中的有效单词数 这道题用正则表达式非常简单但是这个技能点没有get到。1.正则表达式的题解class Solution { public int countValidWords(String sentence) { int count = 0; for (String s : sentence.split(" ")) { if (!s.isEmpty() && s.matches("[a-z]*([a-z]-[a-z])?[a原创 2021-10-24 22:54:47 · 200 阅读 · 0 评论 -
数学运算数据转换问题
441. 排列硬币 解题时因为忽略了小数情况而浪费了大量时间。 long转float可以隐式转换。因为float 范围更大。这里不转换float 直接使用long运算2146467959 时结果得到0。使用隐式转换可以得到正解。这里我产生了疑问:((1.0+i)*i) >= n*2.0; 这里为了提高速度,使用了变式运算避免使用了除法。没有了除法为什么还要隐式转换float才可以得到正解呢?运算时没有除法,不会产生小数float在这是一个怎么样的作用呢?执行用时:27 ms, 在原创 2021-10-12 18:42:26 · 189 阅读 · 0 评论 -
十亿以下整数转换英文(java实现)
273. 整数转换英文表示 使用了模拟的方法,最多10位 从左边开始 1-3位为百位处理模块 4-6 位为千位处理 7位为百万位处理在这里我发现了规律,每一段都需要处理一个 百位数,那么问题就缩小到翻译 1-999 和拼接字符串的问题了。 这道题考察工业代码的开发能力。拆解成多个子方法开发就会简编很多。我使用basicNum()方法为内核,其余问题就变成了简单的字符串拼接。1025666输出"One Million Twenty Five Thousand Six Hundred S原创 2021-10-11 14:38:54 · 282 阅读 · 0 评论 -
合并区间问题
352. 将数据流变为多个不相交区间 题目简述:每次可以添加一个数,并把它放入对象的现有区间内,如果没有新建一个区间,并且要维护每个区间,让他们不会重叠。 使用List<int[]>储存结果 。用模拟的方法不断更新区间,数组中存放左边界和右边界。 要考虑定位问题,这里为了压缩时间使用了二分查找。查找符合条件的 左边界。这样就把合并区间问题留给了右边界。右边界分为四种情况:1.只和当前的区间合并2.只和下一个区间合并3.合并了两个区间插入一个新区间而且当新区间在list.原创 2021-10-09 14:42:02 · 260 阅读 · 0 评论 -
substring查找字符串重复序列
substring+Map 实战187. 重复的DNA序列 “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT” 题目要求序列长度严格要求为10。并且出现次数超过一次。AAAAACCCCCAAAAACCCCCCAAAAAGGGTTTAAAAACCCCC CCCCCAAAAA AAAAACCCCCC CCCCCCAAAAA res ="AAAAACCCCCC","CCCCCCAAAAA" 这里采用HashMap原创 2021-10-08 10:35:49 · 586 阅读 · 0 评论 -
StringBuilder构建字符串
482. 密钥格式化 利用StringBuilder构建格式化密钥,因为要求密钥第一组为小于 要求 大小k的组,那么采取倒叙处理最后再反转字符串的方法求解。Character.toUpperCase© 方法处理小写字母。解答W了两次第一次"---"3 反思:sb.deleteCharAt(sb.length()-1); 之前一定要判sb.length()-1>=0,否则会越界第二次"--a-a-a-a--"2 没有考虑到“a---”的情况,最后要用一个循环删除最后的“--”执原创 2021-10-04 09:01:00 · 223 阅读 · 0 评论 -
StringBuilder记录无限循环小数
166. 分数到小数 构造小数(字符串类型)使用了StringBuilder;使用Hashmap记录模拟除法 的值,并记录长度。 使用String.format 和 StringBuilder的substring方法来进行字符串操作 %s(%s)极大的简化了操作。class Solution { /** String.format("%s(%s)", sb.substring(0, u), sb.substring(u)); format 中第一个%s 为第一个参数 第二原创 2021-10-03 16:53:59 · 201 阅读 · 0 评论 -
进制转换(java实现)
405. 数字转换为十六进制数StringBuilder 要求返回字符串,使用StringBuilder。StringBuilder是线程不安全的,但是相对于StringBuffer速度较快,虽然StringBuffer是线程安全的。 StringBuffer 和SrtringBuilder用法相似。 使用StringBuilder 会比String节省空间。负数二进制运算 按照进制转换,负数的情况需要按位取反,末位+1,但是这需要转换成 2进制,避免多一次进制转换,直接使用 2 的 3原创 2021-10-02 11:18:50 · 475 阅读 · 0 评论 -
两矩形的重叠面积(java实现)
223. 矩形面积 给出一个平面,给出两个矩形求总面积。(可能会重合) 考察数学逻辑,正常的数学计算是非常简单的。class Solution { /** 两个矩形的面积减去重合面积 */ public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) { //求出总面积。 int totalS= Mat原创 2021-09-30 22:38:22 · 1238 阅读 · 0 评论 -
分隔链表(遍历法)
725. 分隔链表 链表分解的话要让链表的末尾.next = null,这道题难度为中级可能只是结合了链表操作。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val,原创 2021-09-22 19:07:20 · 203 阅读 · 1 评论 -
最长递增子序列(动态规划)
300. 最长递增子序列 利用动态规划解题 dp[0] = 1 定义为 第一个元素的包括该元素的最长子串为1; 状态转移方程: 遍历 m m<n 如果nums[m]<nums[n] dp[n] =Math.max(dp[n],dp[m]+1);class Solution { /** 动态规划 */ public int lengthOfLIS(int[] nums) { int res =1; i原创 2021-09-20 21:25:28 · 241 阅读 · 0 评论 -
维护数组左右侧极值(leetcode周总结)
20210919每日一题650. 只有两个键的键盘 模拟算法。A;AA;AAA OR AAAA;直接用代码模拟操作即可。class Solution { /** 问题转换 一开始 num = 1只有+1 操作可选(1,num) 贪心算法 n = 3 n = n-1=2; lastcopy = 1; allcopy = 1 n = 2 n = n-1=1; lastcopy = 1; allcopy = 2 (allcopy>n&原创 2021-09-19 19:27:42 · 225 阅读 · 0 评论 -
HashMap判断有效的数独
36. 有效的数独 给·一个9*9的二维矩阵,每一个单元中有1-9数字或者“.”,1-9只能出现一次。 一个行、列为一个单元 一个3*3(一共9)个为一个单元,写判断是否成立的算法。HashMap的方法class Solution { public boolean isValidSudoku(char[][] board) { Map<Integer,Map<Integer,Integer>> rowMaps = new HashMap<原创 2021-09-17 10:27:55 · 135 阅读 · 0 评论 -
二分查找变形(查找无序数组的峰值)
二分查找无序数组的峰值162. 寻找峰值class Solution { /** 寻找峰值 */ public int findPeakElement(int[] nums) { int res = Integer.MIN_VALUE; int len = nums.length; // 边界条件 if(len == 1){ return 0;原创 2021-09-15 18:09:16 · 387 阅读 · 0 评论 -
双指针比较字符串(长度加字典序)
524. 通过删除字母匹配到字典里最长单词 题目要求盲点:字典序 Java提供了比较字典序的方法。 返回的是差值。 相等返回0; 小于返回负数; 大于返回正数;int compareTo(String anotherString); dic.compareTo(res)<0 //代表dic的字典序小于resclass Solution { /* 计算字典序 给字典赋值。字典序小 两个算法:一个是判断字符串是否为字典中的子串 计原创 2021-09-14 18:45:32 · 236 阅读 · 0 评论 -
统计质数算法的数学优化
204. 计数质数 质数就是只能被“1”和它本身整除的整数。 暴力解法是枚举法,可能会超时。标记倍数法 基于两点事实:1.一个数的乘积一定是合数 2.一个数的倍数一定是合数。class Solution { /** 只能被“1”和它本身整除的数 这是一道数学问题。 如果一个数是质数,那么他的倍数一定是合数 2 3 5 7 9 11 13 17 19 标记i*i和之后的倍数,2就已经把所有的偶数标记了 */原创 2021-09-11 18:17:34 · 160 阅读 · 0 评论 -
HashMap遍历方法
HashMap统计数组元素137. 只出现一次的数字 IIclass Solution { /* 位运算 异或 ^ 1 ^ 0 = 1 两个相同的数字进行异或运算结果为0 1 ^ 1 = 0; 通过逻辑电路 如何设计出三个数操作互相抵消? 没有深入的学习过底层电路 优先使用HashMap来解题 */ public int singleNumber(int[] nums) {原创 2021-09-08 16:56:22 · 152 阅读 · 0 评论 -
大根堆+排序解leetcode(求最优解)
大根堆+排序502. IPO w为手中的资本,profit数组是利润,capital数组为项目对应的成本。 把项目所需要的成本从小到大进行排序。将手中的资本w去投资利润最大的项目profit[i],并且w>capital[i]。 重复操作k次即可。class Solution { /** profits = {1,2,3} //res来源为这个数组 capital = {0,1,1} //判断依据数组 k = 2(可以做两个项目) w =0(起始资金)原创 2021-09-08 16:42:56 · 246 阅读 · 0 评论 -
动态规划求数组最大子序列(累加和累乘)
数组一次遍历134. 加油站gas = [1,2,3,4,5]cost = [3,4,5,1,2]判断是否能环城 or -1 return begin_index执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户内存消耗:38.5 MB, 在所有 Java 提交中击败了78.88%的用户class Solution { /** 返回可以环城的加油站 出发时gas的含量为 box = box+gas[i] 前进后的油耗 box原创 2021-09-06 08:16:55 · 283 阅读 · 0 评论 -
rand7()构建rand10()(概率论的古典概型)
20210905 数学的古典概型 微信面试常考题。470. 用 Rand7() 实现 Rand10() rand7()可以随机生成1到7的整数。/** * The rand7() API is already defined in the parent class SolBase. * public int rand7(); * @return a random integer in the range 1 to 7 *//**题解的要求是均匀的,所以生成的概率要是相同的.(r原创 2021-09-05 09:59:33 · 144 阅读 · 0 评论 -
矩阵dfs(130. 被围绕的区域)
20210904矩阵深度优先搜索130. 被围绕的区域board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]就像围棋一样,如果O在边界并且与其相连的O就视为“突围”,被包围就变成X 难点在于如何确定O是不是连续原创 2021-09-04 19:58:39 · 156 阅读 · 0 评论 -
快速排序算法(Java实现+例题)
文章目录快速排序一、算法简介1.分治思想(涉及递归)2.分区规则3.交换算法(swap)4.最后分治思想的递归实现二、例题[面试题 17.14. 最小K个数](https://leetcode-cn.com/problems/smallest-k-lcci/)1.暴力解法(超时)2.快排(直接调用Arrays.sort秒题)3.手写快排算法快速排序一、算法简介 我用尽可能简单的语言描述一下快速算法。1.分治思想(涉及递归) 快排采用的分治思想:可以简单的理解为 [ {小于num的区域},num原创 2021-09-03 10:48:09 · 439 阅读 · 0 评论 -
Set的contains方法查找(128. 最长连续序列)
使用set降低时间复杂度。128. 最长连续序列 算法时间复杂度要求是O(n),暴力-排序的话会超时,如何降低复杂度? 使用Set来储存数组,如果查找下一个连续数那么res++;但是问题出现了,如何处理不连续的数据? [1,2,3 ,4,6,7,8,9] 一旦找不到5那么就会失去遍历目标。 [1,2,3,4,1010,1011,1012,1013] 如果采用逐个遍历,那么时间复杂度为num[max] 使用set的contains方法。 一次遍历数组元素num,然后如果不存在(num原创 2021-09-02 17:54:35 · 463 阅读 · 0 评论 -
字符串中级题(数字字符串分割比较)
165. 比较版本号 难点是比较001、00001与1,他们的数值是相等的。字符串分割后再parseInt完美解决这个问题。class Solution { public int compareVersion(String version1, String version2) { //.是转义字符,所以加\\ String[] v1 = version1.split("\\."); String[] v2 = version2.原创 2021-09-01 09:04:09 · 153 阅读 · 0 评论 -
差分法(利用差分数组解leetcode)
坚持写博客是一个好习惯,日日精进。20210831每日一题(get到差分法)1109. 航班预订统计1.暴力解法(面试官可能会挂人) leetcoder 在评论区评论 这道题面试官给他30分钟,他3分钟写出暴力解法,直接被挂掉。class Solution { public int[] corpFlightBookings(int[][] bookings, int n) { int len = bookings.length; int[] dp .原创 2021-08-31 21:59:13 · 286 阅读 · 0 评论 -
算法题(枚举统计1的个数)
233. 数字 1 的个数枚举(超时)class Solution { public int countDigitOne(int n) { //位运算 无符号位右移 >>> 0000 0001 &1 ==1 (1&1 = 1 ,1&0 = 0 ) //类比 循环%10 int res = 0; for(int i = 1;i<=n;i++){原创 2021-08-13 11:36:37 · 210 阅读 · 0 评论