算法专题
Tarafireworks
这个作者很懒,什么都没留下…
展开
-
list.sort(Comparator.comparingInt(Map.Entry::getValue))
List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());list.sort(Comparator.comparingInt(Map.Entry::getValue));原创 2021-08-29 00:14:59 · 2484 阅读 · 0 评论 -
矩阵顺时针螺旋旋转
public int[] circlePrint(int[][] input) { int m = input.length; int n = input[0].length; int[] res = new int[m * n]; int left = 0, right = input[0].length - 1; int top = 0, bottom = input.length - 1; int cur.原创 2021-08-29 00:02:08 · 171 阅读 · 0 评论 -
删除字符串中出现最少的字符
public String[] delMinFrequencyChar(String[] input) { int n = input.length; String[] res = new String[n]; for (int i = 0; i < n; i++) { String s = input[i]; char[] chs = s.toCharArray(); Map&l原创 2021-08-29 00:01:44 · 673 阅读 · 0 评论 -
大小堆(优先队列PriorityQueue)解决数据流的中位数
295. 数据流的中位数用两个优先队列queMax 和 queMin 分别记录大于中位数的数和小于等于中位数的数。当累计添加的数的数量为奇数时,queMin 中的数的数量比 queMax 多一个,此时中位数为 queMin 的队头。当累计添加的数的数量为偶数时,两个优先队列中的数的数量相同,此时中位数为它们的队头的平均值。当我们尝试添加一个数 num 到数据结构中,我们需要分情况讨论:num≤max{queMin}此时num 小于等于中位数,我们需要将该数添加到queMin 中。新的中原创 2021-08-27 10:42:32 · 394 阅读 · 0 评论 -
双指针实现贪心解决救生艇最小船数问题
881. 救生艇要使需要的船数尽可能地少,应当使载两人的船尽可能地多。设people 的长度为 n。考虑体重最轻的人:若他不能与体重最重的人同乘一艘船,那么体重最重的人无法与任何人同乘一艘船,此时应单独分配一艘船给体重最重的人。从people中去掉体重最重的人后,我们缩小了问题的规模,变成求解剩余n-1个人所需的最小船数,将其+1即为原问题的答案。若他能与体重最重的人同乘一艘船,那么他能与其余任何人同乘一艘船,为了尽可能地利用船的承载重量,选择与体重最重的人同乘一艘船是最优的。从 people原创 2021-08-26 20:54:04 · 139 阅读 · 0 评论 -
双指针实现队列滑动窗口
209. 长度最小的子数组 //队列实现的滑动窗口(两个指针,一个指向队头一个指向队尾 public int minSubArrayLen(int target, int[] nums) { int n = nums.length; if (n == 0) { return 0; } int ans = Integer.MAX_VALUE; int start = 0, end = 0;转载 2021-08-26 20:08:56 · 193 阅读 · 0 评论 -
Java中的左移右移
<<<<表示左移,不分正负数,低位补0;<<1, v = v * 2<<2, v = v * 4<<3, v = v * 8v左移n位, f(v, n) = v * math.pow(2, n),正负数一样的公式, 但是注意溢出问题对于正数/负数: *2表示左移一位 20的二进制补码:0001 0100向左移动两位后:0101 0000结果:r = 80负数:r = -20 << 2-20 的二进制原码 :10原创 2021-08-22 18:34:29 · 486 阅读 · 0 评论 -
Java中Bitset的使用
参考Bitset是Java中的一种数据结构。Bitset中主要存储的是二进制位,做的也都是位运算,每一位只用来存储0,1值,主要用于对数据的标记。Bitset的基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。使用的时候可以根据某一个位是否为0表示此数是否出现过。JDK中的BitSet集合对是布隆过滤器中经常使用的数据结构Bitmap的相对简单的实现。BitSet采用了Bitmap的算法思想。使用场景:整数,无重复。...转载 2021-08-22 18:23:09 · 817 阅读 · 0 评论 -
康托对角线解算法题
康托对角线:5851. 找出不同的二进制字符串只要与每个数只要有一位不同,那最后这个数一定是个不同的数。遇到该位为1,则翻转为0。否则翻转为1:class Solution { public String findDifferentBinaryString(String[] nums) { int n = nums.length; StringBuilder sb = new StringBuilder(); for (int i = 0; i < n; i++) {转载 2021-08-22 15:00:41 · 270 阅读 · 0 评论 -
Integer.toBinaryString() 的用法
在Integer这个包装类里面有一个toBinaryString的方法,作用是:以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式(类似还有toHexSrting()方法和toOctalString()方法)。5851. 找出不同的二进制字符串public String substring(int beginIndex, int endIndex)substring() 方法返回字符串的子字符串。beginIndex – 起始索引(包括), 索引从 0 开始。endIndex –原创 2021-08-22 14:50:45 · 8681 阅读 · 0 评论 -
Javascript算法——冒泡排序
冒泡排序是一种稳定的排序方式,如果遇到相等的值不进行交换。1.原理:比较两个相邻的元素,将值大的元素交换到右边2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。(2)比较第2和第3个数,将小数 放在前面,大数放在后面。…(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时原创 2021-08-17 14:41:57 · 483 阅读 · 0 评论 -
Javascript算法——归并排序
归并排序采用的是分治的思想,首先是“分”,将一个数组反复二分为两个小数组,直到每个数组只有一个元素;其次是“治”,从最小数组开始,两两按大小顺序合并,直到并为原始数组大小。“分”就是将原始数组逐次二分,直到每个数组只剩一个元素,一个元素的数组自然是有序的,所以就可以开始“治”的过程了。“治”实际上是将已经有序的数组合并为更大的有序数组。那么怎样将已经有序的数组合并为更大的有序数组?很简单,创建一个临时数组C,比较A[0],B[0],将较小值放到C[0],再比较A[1]与B[0](或者A[0],B[1])原创 2021-08-17 11:51:20 · 337 阅读 · 0 评论 -
Javascript算法——快速排序
快速排序使用分治,一次分治下来小的在左边,大的在右边。递归重复这个过程,使整个数组有序。从数组中取出一个数作为基准(pivot)。在原数组中进行移动,将大于基准的数放到基准右边,小于基准的数放到基准左边,在基准左右形成两个子数组。在左右子数组中反复执行步骤1、2,直到所有子数组只剩下一个数。javascript语言实现参考这篇// 快排function quickSort(arr, i, j) { if(i < j) { let left = i; let righ原创 2021-08-17 10:51:03 · 372 阅读 · 0 评论 -
Javascript算法——堆排序
参考堆的预备知识堆是一个完全二叉树。完全二叉树: 二叉树除开最后一层,其他层结点数都达到最大,最后一层的所有结点都集中在左边(左边结点排列满的情况下,右边才能缺失结点)。大顶堆:根结点为最大值,每个结点的值大于或等于其孩子结点的值。小顶堆:根结点为最小值,每个结点的值小于或等于其孩子结点的值。堆的存储: 堆由数组来实现,相当于对二叉树做层序遍历对二叉树做升序排序,总共分为三步:将初始二叉树转化为大顶堆(heapify)(实质是从第一个非叶子结点开始,从下至上,从右至左,对每一个非叶子结原创 2021-08-17 00:53:32 · 181 阅读 · 0 评论 -
Javascript算法——shell 排序
希尔排序本质上是一种插入排序,但是对数列进行了等间隔分组处理,在每一组中做插入排序,这一优化使得时间复杂度降到了O(n^2)以下。基本思想希尔排序是按一定的间隔对数列进行分组,然后在每一个分组中做插入排序;随后逐次缩小间隔,在每一个分组中做插入排序…直到间隔等于1,做一次插入排序后结束。那么问题来了,间隔应该取多大,怎么缩小?通常我们去取初始间隔为数列长度的一半:gap = length/2,以 gap = gap/2 的方式缩小,下面详细图解整个过程。原始数组数组如下:首先取间隔为 gap =转载 2021-08-16 20:35:51 · 168 阅读 · 0 评论 -
Javascript算法——插入排序
**算法思想:**将无序元素插到有序元素中去步骤1: 从第一个元素开始,该元素可以认为已经被排序;步骤2: 取出下一个元素,在已经排序的元素序列中从后向前扫描;步骤3: 如果该元素(已排序)大于新元素,将该元素移到下一位置(腾位置);步骤4: 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;步骤5: 将新元素插入到该位置后;步骤6: 重复步骤2~5。function insertSort(arr) { let length = arr.length; for(let i =转载 2021-08-16 16:58:29 · 286 阅读 · 0 评论 -
Javascript算法——选择排序
1. 算法描述选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n2) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。通俗来说就是你们中间谁最小谁就出列,站到队列的最后边,然后继续对着剩余的无序数组说你们中间谁最小谁就出列,站到队列的最后边,一直到最后一个,继续站到最后边,这样数组就有了顺序,从小到大。2. 算法步骤在未排序序列中找到最小(大)元素,存放到排序序列的起始位置从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重转载 2021-08-16 15:56:20 · 181 阅读 · 0 评论 -
nums[slow] * nums[next(fast)] > 0,关于这个条件的解释:
来自力扣457. 环形数组是否存在循环nums[slow] * nums[next(fast)] > 0,关于这个条件的解释:举个例子:[1,2,2,-1,1,-1]第一步:slow = 0, fast = 1; nums[slow] = 1, nums[fast] = 2, nums[slow] * nums[fast] > 0;第二步:slow = 1, fast = 2; nums[slow] = 2, nums[fast] = 1, nums[slow] *原创 2021-08-11 12:10:12 · 227 阅读 · 0 评论 -
return ((i + nums[i]) % n + n) % n
来自力扣457. 环形数组是否存在循环为什么要%n +n 再%n, 直接%n有什么问题?1. 负数取模;2. 直接%可能出负数;3. cur + nums[cur]存在小于0的可能;4. 只做 (cur + nums[cur]) % n这个只能处理正方向,如果是负的,就是反方向,需要先%n确保在范围内,然后+n再%n起到一个向左的效果;5. 会出现 (cur + nums[cur]) % n == len(nums) 的情况,故后跟 …%n 将其转化为 0;6. 不行,比如cur = 2,nu原创 2021-08-11 11:54:59 · 180 阅读 · 0 评论
分享