算法
Milk0nly
这个作者很懒,什么都没留下…
展开
-
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 · 2388 阅读 · 0 评论 -
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 · 1925 阅读 · 0 评论 -
LeetCode最后一个单词的长度
题解:从字符串末尾开始向前遍历,其中主要有两种情况第一种情况,以字符串”Hello World“为例,从后向前遍历直到遍历到头或者遇到空格为止,即为最后一个单词”World“的长度。第二种,以字符串”Hello World“为例,需要先将末尾的空格过滤掉,在进行第一种情况的操作。即认为最后一个单词为”World“,长度为5class Solution { public int lengthOfLastWord(String s) { int end = s.length(原创 2021-11-21 22:20:26 · 2488 阅读 · 0 评论 -
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 · 2396 阅读 · 0 评论 -
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 · 174 阅读 · 0 评论 -
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 · 2368 阅读 · 0 评论 -
LeetCode229 求众数II 摩尔投票算法
题目描述:给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。示例:输入:[3,2,3]输出:[3]题解:摩尔投票算法:摩尔投票算法的核心思想是对拼抵消,首先我们考虑最基本的摩尔投票问题,比如找出一组数字序列中出现次数大于总数1/2的数字,易知若该元素存储,则只会存储一个这样的数。假设这个数是nums[0],初始其票数为1,那么对摩尔投票进行扩展,求大于n/3的所有元素,易知该元素最多有两个,因此我们可以初始化两个element,按和上面一样的流程,最后将出原创 2021-11-16 18:53:24 · 933 阅读 · 0 评论 -
拓扑排序解两道LeetCode题
LeetCode210 课程表II题目描述:现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回原创 2021-11-16 18:23:38 · 73 阅读 · 0 评论 -
基数排序思想及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 · 68 阅读 · 0 评论 -
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 · 72 阅读 · 0 评论 -
LeetCode 319 灯泡开关
题目描述:初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭一个。第三轮,你每三个灯泡就切换一个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换一个灯泡的开关。直到第 n 轮,你只需要切换最后一个灯泡的开关。找出并返回 n 轮后有多少个亮着的灯泡。示例:输入:n = 3输出:1 解释:初始时, 灯泡状态 [关闭, 关闭, 关闭].第一轮后, 灯泡状态 [开启, 开启, 开启].第二轮后, 灯泡状态 [开启原创 2021-11-16 09:18:44 · 67 阅读 · 0 评论 -
LeetCode 水壶问题 贝祖定理
贝祖定理:ax+by=z 有解当且仅当 zz 是 x, yx,y 的最大公约数的倍数(a,b,x,y,z都是整数)原创 2021-11-14 15:07:59 · 231 阅读 · 0 评论 -
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 · 951 阅读 · 0 评论 -
快速幂算法
问题: 如何快速高效地计算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 · 189 阅读 · 0 评论 -
双指针法求有序数组中元素之差小于等于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 · 520 阅读 · 0 评论 -
并查集(UnionFind)原理及优化过程
并查集并查集:并查集也叫不相交集合。具有两个核心操作:查找元素在哪个集合里将两个集合联合在一起在实际使用中,也通常判断两个元素是否在同一个集合里面。一个小小的例子这张图里有12个村庄。不同的村庄之间有不同的连接情况。那么如何在代码中做到连接两个村庄,判断两个村庄之间是否有路能够互通呢?这就要用到并查集。并查集的代码实现主要可以分为Quick Find和Quick Union.实现代码1-Quick Find我们在底层用数组来实现。数组中某个位置的元素就代表着这个位置元素的pare原创 2020-10-23 21:35:08 · 1060 阅读 · 0 评论 -
插入排序执行流程及代码实现
插入排序执行流程插入排序很类似玩扑克牌时候的“插入”在执行过程中,插入排序会将序列分为两部分,第一部分是已经排好序,有序的元素,剩下的是还没有排序的乱序的元素。插入排序就是将一个个没有排好序的乱序元素插入排好序的两个元素之间。也就是两步:在执行过程中,插入排序会将序列分为2部分。头部是已经排好序的,尾部是待排序的。从头开始扫描每一个元素。每当扫描到一个元素,就将它插入到头部合适的位置,使得头部数据依然保持有序。也就是按照下面的方法:Java代码实现我们将一组数据中的第一个元素看作的原创 2020-10-19 23:05:22 · 458 阅读 · 0 评论 -
选择排序执行流程及代码实现
选择排序执行流程执行流程很简单:① 从序列中找出最大的那个元素,然后与最末尾的元素交换位置✓ 执行完一轮后,最末尾的那个元素就是最大的元素② 忽略 ① 中曾经找到的最大元素,重复执行步骤 ①(当然也可以用寻找最小值放在最前面的方法)代码实现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 · 308 阅读 · 0 评论 -
冒泡排序(以从小到大为例)原理及其优化
冒泡排序原理冒泡排序简要来说就是循环让相邻两个元素比较,如果左边的元素比右边的元素大,则左右交换位置,直到数组中所有元素排列完毕为止。用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 · 913 阅读 · 0 评论