- 博客(26)
- 资源 (1)
- 收藏
- 关注
原创 LeetCode 丢失的数字
做差法:class Solution { public int missingNumber(int[] nums) { int n = nums.length; int cur = 0, sum = n * (n + 1) / 2; for (int i : nums) cur += i; return sum - cur; }}异或法:class Solution { public int missi.
2021-11-21 22:45:02
2426
原创 LeetCode 螺旋矩阵II
class Solution { public int[][] generateMatrix(int n) { int l = 0, r = n - 1, t = 0, b = n - 1; int[][] mat = new int[n][n]; int num = 1, tar = n * n; while(num <= tar){ for(int i = l; i <= r; i++) mat[
2021-11-21 22:31:04
1960
原创 LeetCode最后一个单词的长度
题解:从字符串末尾开始向前遍历,其中主要有两种情况第一种情况,以字符串”Hello World“为例,从后向前遍历直到遍历到头或者遇到空格为止,即为最后一个单词”World“的长度。第二种,以字符串”Hello World“为例,需要先将末尾的空格过滤掉,在进行第一种情况的操作。即认为最后一个单词为”World“,长度为5class Solution { public int lengthOfLastWord(String s) { int end = s.length(
2021-11-21 22:20:26
2535
原创 LeetCode 字符串相乘
如果num1和num2之一是0,则直接将0作为结果返回即可。如果num1和num2都不是0,则可以通过模拟竖式乘法的方法计算乘机。从右往左遍历乘数,将乘数的每一位与被乘数相乘得到对应的结果,再将每次得到的结果累加。这道题中,被成熟是num1,乘数是num2.需要注意的是num2除了最低位外,其余的每一位的运算结果都需要补0.class Solution { public String multiply(String num1, String num2) { if (num1.e
2021-11-21 20:37:33
2432
原创 LeetCode 字符串相加
class Solution { public String addStrings(String num1, String num2) { StringBuilder res = new StringBuilder(""); int i = num1.length() - 1, j = num2.length() - 1, carry = 0; while(i >= 0 || j >= 0){ int n1 = i
2021-11-21 20:25:06
185
原创 LeetCode 动态规划解最长回文子串
题目描述:给你一个字符串 s,找到 s 中最长的回文子串。示例:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。解题思路:动态规划,设dp[i][j]为s[i]-s[j]这个字符串是否为回文串,那么显而易见,i==j时,dp[i][j]=truei!=j时:如果子串的长度小于等于2,那么dp[i][j] = (s[i]==s[j])如果子串的长度大于2,那么dp[i][j] = (dp[i+1][j-1])&& (s[i]
2021-11-21 16:33:53
2405
原创 LeetCode229 求众数II 摩尔投票算法
题目描述:给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。示例:输入:[3,2,3]输出:[3]题解:摩尔投票算法:摩尔投票算法的核心思想是对拼抵消,首先我们考虑最基本的摩尔投票问题,比如找出一组数字序列中出现次数大于总数1/2的数字,易知若该元素存储,则只会存储一个这样的数。假设这个数是nums[0],初始其票数为1,那么对摩尔投票进行扩展,求大于n/3的所有元素,易知该元素最多有两个,因此我们可以初始化两个element,按和上面一样的流程,最后将出
2021-11-16 18:53:24
962
原创 拓扑排序解两道LeetCode题
LeetCode210 课程表II题目描述:现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回
2021-11-16 18:23:38
85
转载 基数排序思想及Java实现
原文地址:原理:求出数据中最大数的位数,对从个位到最高位的每一位进行排序,先入桶,再出桶,最后得到的数组就是有序数组。class Demo{ public static void main(String[] args) { //定义整型数组 int[] arr = {21,56,88,195,354,1,35,12,6,7}; //调用基数排序函数 lsd_RadixSort(arr,3); //输出排
2021-11-16 18:07:26
73
原创 LeetCode391 完美矩形
问题描述:给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) ,右上顶点是 (ai, bi) 。如果所有矩形一起精确覆盖了某个矩形区域,则返回 true ;否则,返回 false 。示例:输入:rectangles = [[1,1,3,3],[3,1,4,2],[3,2,4,4],[1,3,2,4],[2,3,3,4]]输出:true解释:5 个矩形一起可以精确地覆盖一
2021-11-16 09:57:33
80
原创 LeetCode 319 灯泡开关
题目描述:初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭一个。第三轮,你每三个灯泡就切换一个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换一个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。找出并返回 n 轮后有多少个亮着的灯泡。示例:输入:n = 3输出:1 解释:初始时, 灯泡状态 [关闭, 关闭, 关闭].第一轮后, 灯泡状态 [开启, 开启, 开启].第二轮后, 灯泡状态 [开启
2021-11-16 09:18:44
77
原创 LeetCode 水壶问题 贝祖定理
贝祖定理:ax+by=z 有解当且仅当 zz 是 x, yx,y 的最大公约数的倍数(a,b,x,y,z都是整数)
2021-11-14 15:07:59
239
原创 LeetCode 质数计数(厄拉多塞筛法)
问题:统计所有小于非负整数 n 的质数的数量。示例:输入:n = 10输出:4解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。优化做法:厄拉多塞筛法:算法详解及图片展示代码:`public static int countPrime(int n){int count = 0;boolean[] signs = new boolean[n];for (int i = 0; i < n;i++){signs[i] = true;} for
2021-11-14 13:03:02
961
原创 快速幂算法
问题: 如何快速高效地计算a的b次幂。使用递归函数:int mypow(int a, int k) { if (k == 0) return 1; if (k % 2 == 1) { // k 是奇数 return a * mypow(a, k - 1); } else { // k 是偶数 int sub = mypow(a, k / 2); return sub * sub; }}
2021-11-14 12:47:39
196
原创 双指针法求有序数组中元素之差小于等于k的数量
求有序数组中元素之差小于等于k的数量这个问题可以使用双重循环解决,但是时间复杂度过高,采用双指针法优化解答。假设数组为[1,2,3,4,7,9,10]设左指针l为0,右指针r为1.总体思路:1.使用左右指针,右指针r正常遍历数组nums,左指针l要保证nums[r] - nums[l] <= k2.对于每一个数nums[r],它和之前的数的距离小于mid的数量为 r - l,把这个值加到cnt中如图:结合代码理解:public class GetCount { // 求
2021-11-14 10:12:19
544
原创 LeetCode677 键值映射
LeetCode677 键值映射题目描述:实现一个 MapSum 类,支持两个方法,insert 和 sum:MapSum() 初始化 MapSum 对象void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对将被替代成新的键值对。int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和示例:```bash示
2021-11-14 09:13:56
382
原创 剑指 Offer 47. 礼物的最大价值
剑指 Offer 47. 礼物的最大价值leetcode链接题目描述在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?输入: [ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物Java代码:class Solu
2020-11-03 21:37:29
82
原创 leetcode刷题(Java):151. 翻转字符串里的单词
151. 翻转字符串里的单词leetcode链接题目描述:给定一个字符串,逐个翻转字符串中的每个单词。说明:无空格字符构成一个 单词 。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。示例:输入:"the sky is blue"输出:"blue is sky the"输入:" hello world! "输出:"world! hello"解释:输入字符串可以在前面或者后面包含多余的空格,但
2020-11-01 21:40:25
104
原创 并查集(UnionFind)原理及优化过程
并查集并查集:并查集也叫不相交集合。具有两个核心操作:查找元素在哪个集合里将两个集合联合在一起在实际使用中,也通常判断两个元素是否在同一个集合里面。一个小小的例子这张图里有12个村庄。不同的村庄之间有不同的连接情况。那么如何在代码中做到连接两个村庄,判断两个村庄之间是否有路能够互通呢?这就要用到并查集。并查集的代码实现主要可以分为Quick Find和Quick Union.实现代码1-Quick Find我们在底层用数组来实现。数组中某个位置的元素就代表着这个位置元素的pare
2020-10-23 21:35:08
1128
原创 插入排序执行流程及代码实现
插入排序执行流程插入排序很类似玩扑克牌时候的“插入”在执行过程中,插入排序会将序列分为两部分,第一部分是已经排好序,有序的元素,剩下的是还没有排序的乱序的元素。插入排序就是将一个个没有排好序的乱序元素插入排好序的两个元素之间。也就是两步:在执行过程中,插入排序会将序列分为2部分。头部是已经排好序的,尾部是待排序的。从头开始扫描每一个元素。每当扫描到一个元素,就将它插入到头部合适的位置,使得头部数据依然保持有序。也就是按照下面的方法:Java代码实现我们将一组数据中的第一个元素看作的
2020-10-19 23:05:22
467
原创 选择排序执行流程及代码实现
选择排序执行流程执行流程很简单:① 从序列中找出最大的那个元素,然后与最末尾的元素交换位置✓ 执行完一轮后,最末尾的那个元素就是最大的元素② 忽略 ① 中曾经找到的最大元素,重复执行步骤 ①(当然也可以用寻找最小值放在最前面的方法)代码实现int[] array = new int[] {4,2,1,5,7,0,3,88,-26,9,2,7}; for(int end = array.length;end > 0 ;end--) { int maxIndex = 0; f
2020-10-17 20:47:32
315
原创 冒泡排序(以从小到大为例)原理及其优化
冒泡排序原理冒泡排序简要来说就是循环让相邻两个元素比较,如果左边的元素比右边的元素大,则左右交换位置,直到数组中所有元素排列完毕为止。用Java代码表示:int[] array = new int[] {22,13,45,34,89,14,64}; for(int end = array.length; end > 0; end--) { for(int begin = 1; begin < end; begin++) { //如果前面的比后面的大,则交换
2020-10-17 20:05:52
925
原创 关于String的不可变特性及两道面试题的详解
String的不可变特性众所周知,String是不可变的,可是它为什么不可变呢?我们查看String的源代码就能知道。String中的属性都是private final的,这就意味着String的属性作为一个常量不可被修改。. String中存放着字符串的容器value本身是一个数组,数组的长度不可变。但是,对于这样的代码: String s = "ABCabc"; System.out.println("s = " + s);//s = ABCabc s = "abc
2020-10-17 09:38:15
346
1
原创 数据库的并发问题
常见并发问题当多个同时运行的事务访问某一个数据时,如果采取相应措施,就有可能发生下列并发问题:脏读 : 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段。之后, 若 T2 回滚, T1读取的内容是T2读出的内容就是T2没有被提交的字段,是临时且无效的。不可重复读 : 对于两个事务T1与T2,T1读取了某个字段,这时T2更新并提交了该字段,则T1读取的内容会发生改变。大多数时候会忽略这个问题,但更严谨的是在T1没有执行完成时,保持T1读取的字段的一致性。幻读 : 对于
2020-10-16 21:51:47
559
原创 数据库事务
何为数据库事务?通俗来讲,数据库事务就是把一系列操作看成一个整体,这个整体要么执行成功,要么因为种种原因,彻底执行失败,也就是这个整体中的任何一个操作都没有执行。(要么全部成功,要么全部失败)。应用场景经典例子:甲方给乙方转账1000元,甲的账户先减去1000元,乙的账户再增加1000元。但是如果因为某种原因,使甲账户减去1000后,乙的账户增加1000元这个操作执行失败,这个时候就不能让甲的余额减去1000,因为甲乙的账户余额是一个整体,一荣俱荣,一损俱损。这时候就要让对甲的操作回滚(rollba
2020-10-16 20:53:17
92
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人