算法专栏
蜡笔小七
没有迷路的人,只有迷人的路。
展开
-
算法-前缀和+Map表思想
前缀和非常精巧的用key作为一个可重复出现的条件,value为最早出现这个条件值的下标例题 * 给你一个整数数组 nums 和一个整数k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组: * * 子数组大小 至少为 2 ,且 * 子数组元素总和为 k 的倍数。 * 如果存在,返回 true ;否则,返回 false 。 * * 如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。 * * 输入:nums = [23,2,4,6,7原创 2021-06-03 18:00:15 · 248 阅读 · 0 评论 -
算法-进制,常见规律
各种进制代表的符号二进制:0dXXXX八进制:0XXXX十六进制:0xXXXX例子二进制0d10101010八进制0X252十六进制0xaa常见知识4^x % 3 == 1如果一个数n是2的x次幂 那么 n&(n-1)==0原创 2021-05-31 11:29:33 · 152 阅读 · 0 评论 -
算法-有关2的次幂问题
如何判断一个数是2的次幂可以巧妙的使用位运算思路12的n次幂转换为二进制码如 2为 10 4为 100 8为 1000可以观察出来 所有的位上只有一个1 则可以使用移位运算 算出 有多少个1即可 int count = 0; if(n>0){ for(int i=0;i<31;i++){ count += n & 1; n >>= 1;原创 2021-05-30 11:08:20 · 400 阅读 · 0 评论 -
LeetCode-477-汉明距离总和
汉明距离指的是两个数不同位数的总和如00110101则汉明距离为20000111111汉明距离为4汉明距离总和计算一个数组中,任意两个数之间汉明距离的总和。输入: 4, 14, 2输出: 6解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。(这样表示是为了体现后四位之间关系)所以答案为:HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 +原创 2021-05-28 08:46:06 · 72 阅读 · 0 评论 -
算法-leetcode-1190-反转每对括号间的子串
/**给出一个字符串 s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中 不应 包含任何括号。输入:s = “(abcd)”输出:“dcba”输入:s = “(u(love)i)”输出:“iloveu”输入:s = “a(bcdefghijkl(mno)p)q”输出:“apmnolkjihgfedcbq”*/public class dayB {/** * 使用栈 即可解决这个问题 关键点原创 2021-05-27 00:28:35 · 128 阅读 · 0 评论 -
常见概念- 字符顺序
在对字符串排序中我们经常会碰到对字符排序,这个具体是啥意思呢如aa 与 ab 这里 ab>abaa 与 ba 这里 ba>aaac 与 bb 这里 bb>ac也就是以字母顺序优先级来排序,先比较第一位,如果第一位相同就去比第二位aa<ab<ba<bb<cb<ccabc<b...原创 2021-05-21 16:12:06 · 809 阅读 · 0 评论 -
算法-堆排序
一.堆排序平均时间复杂度 O(nlogn)最坏时间复杂度 O(nlogn)最好时间复杂度 O(nlogn)空间复杂度 O(1)稳定性 是选择排序的升级版 是不稳定的二.思路1.首选需要了解几个概念什么是堆完全二叉树深度为 k,有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 k 的满二叉树中序号为 1 至 n 的节点对应;简单来说,就是除深度是k 层之外,其他各层(1至k-1)的节点数都达到最大个数,第k 层的所有节点都连续几个在最左边例子图b 是完全二叉树, c和d原创 2021-05-17 21:06:32 · 107 阅读 · 0 评论 -
算法-桶排序
一.桶排序平均时间复杂度:O(n + k)最佳时间复杂度:O(n + k)最差时间复杂度:O(n ^ 2)空间复杂度:O(n * k)稳定性:稳定桶排序是一个经典的用空间换时间的排序,排序速度很快二.思路将被排序数组分组放到每个桶里去如数组 : 9,4,3,1,2,8,6,7,5可以用三个桶放入三组数据1-3 4-6 7-9计算被排序数组的最大值和最小值根据最大值和最小值差值去开辟桶空间将待排序数组放到桶里去对每个桶进行排序(可以自选,如快速排序,插入排序)将排序好原创 2021-05-17 16:20:55 · 50 阅读 · 0 评论 -
算法-归并排序
1.归并排序前面我们介绍了快速排序和希尔排序,快速通过寻找基准数的方式将小于基准数放到基准数左边大于基准数的值放到右边,再递归排序。 希尔排序则是对数列进行分段,然后使用插入排序重新排序。是两种不同的思路 ,归档排序则是第三种不同的排序思路平均时间复杂度O(nlogn)最坏时间复杂度O(nlogn)最好时间复杂度O(nlogn)空间复杂度O(n)是否稳定 稳定二.思路归并排序有几个关键点1.low 排序数组的起点2.height 排序数组的终点3.mid 排序数组的中间点 也叫原创 2021-05-14 14:04:40 · 106 阅读 · 1 评论 -
算法-希尔排序
一.希尔排序最好时间复杂度 O(n)最坏时间复杂度 O(ns)平均时间复杂度O(nlogn)空间复杂度 O(1)稳定性 不稳定在详细学习快排和希尔排序后,不得不感叹算法的精妙之处,也让我感受到了算法的乐趣希尔排序是由一个计算机科学家Donald Shell 发明的 实际上是一个插入排序的优化-- 分组插入排序二.思路主要就是逐步折半的增量方法,将数列等分为若干个数值对,并对每个数组对进行比较,将较小的数组对放在前面,粗略的对数列进行排序,关键变量希尔增量 shellIncrem原创 2021-05-13 23:41:47 · 1279 阅读 · 2 评论 -
算法-快速排序
一.快速排序平均时间复杂度 O(nlogn)最坏时间复杂度 O(n^2)最好时间复杂度 O(nlogn)空间复杂度 O(nlogn)稳定性 不稳定 (在排序过程中可能出现不相连的下标值替换的情况,会影响数组的相对顺序)思路快速排序是常用并且非常精巧的排序方式,理解快速排序首先你需要对递归有一个初步的了解,如果没有可以自行网上了解下关键变量基准数 pivot基准数下标 pivotIndex排序最左下标 left排序最右下标 right步骤判断递归停止条件 left &l原创 2021-05-12 18:06:40 · 89 阅读 · 0 评论 -
算法-插入排序
一.插入排查平均时间复杂度 O(n^2)最差时间复杂度 O(n^2)最好时间复杂度 O(n)空间复杂度 O(1)稳定性 稳定的(排序过程不会破坏元素前后的相对顺序)二.思路插入排序 思路 将数组重新排序 分隔非已排序数组 和待排序数组 具体类似扑克牌 从前往后遍历,每到一个下标和前面的已排序数组进行比较 如果比他小就往前插,被比较的数组值往后移动一个下标例子943128675第一次排序 493128675第二次排序 349128675第三次排序 13492867原创 2021-05-12 14:33:35 · 39 阅读 · 0 评论 -
算法-直接选择排序
一.直接选择排查简介 简单排序平均时间复杂度 O(n^2)最差时间复杂度 O(n^2)最好时间复杂度 O(n)空间复杂度 0稳定性 由于在直接选择排序中存在着不相邻元素之间的互换,会破坏前后元素相对顺序,则为不稳定性排序算法二.思路遍历数组 外层每次遍历寻找出最小的值放到最前面三.实现 /** * 选择排序 思路 遍历数组 外层每次遍历寻找出最小的值放到最前面 * @param array 待排序数组 * @return */原创 2021-05-10 17:00:28 · 105 阅读 · 0 评论 -
算法-冒泡排序
一.冒泡排序介绍,简单的入门排序算法时间复杂度 O(n^2) 最小时间复杂度O(n) (已经排序好的情况)空间复杂度 0 没有耗费额外的空间二.思路通过遍历数组寻找最大的值放到数组的最后,每次通过前后两个值进行比较找出最大的值,并且交换位置如32514 经过第一次排序23145 最大的值放到最后了实际过程23514 – 23154 – 23145三.实现 public static int[] bubbleSort(int[] array){ for(int原创 2021-05-10 16:37:29 · 43 阅读 · 0 评论 -
算法-二分查找法
一.二分查找法介绍:二分查找法是一种寻址算法,在一个有序序列中找寻指的数值的下标时间复杂度:O(logn)二.思路1.关键变量start 开始下标end 结束下标mid 中间小标重点是找寻中间下标 array[mid] < a,说明a在array[mid]右边,此时变换start下标为start=mid+1 ,此时寻址从mid+1 到end ,array[mid] > a 同理,end下标变更为 end=mid-1 最终start==end时找到变量...原创 2021-05-10 14:38:42 · 350 阅读 · 0 评论