
算法
本专栏,将和大家一起学习常见的算法。
Y-peak
一个努力的小白pwn
展开
-
寻找峰值(局部最大、局部最小)——二分查找
寻找峰值也就是局部最大,可以采用二分法来实现。当然局部最小也一样。峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞ 。你必须实现时间复杂度为 O(log n) 的算法来解决此问题。解题思路类似这种局部最小和局部最大的问题。我们均可以采用二分的方法来解决,并不一样非要有序才可使用二分进行搜索。特定条件的无序也是可以的。简单原创 2021-09-15 20:03:35 · 3711 阅读 · 0 评论 -
搜索插入位置
搜索插入位置题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums = [1,3,5,6], target = 5输出: 2示例 2:输入: nums = [1,3,5,6], target = 2输出: 1示例 3:输入: nums = [1,3,5,6], target = 7输出: 4示例 4:输入: num原创 2021-09-13 12:50:13 · 525 阅读 · 0 评论 -
二分查找(对半搜索)
二分查找(对半搜索)本文采用Java书写选择排序,其他语言类似可以借鉴着写所谓二分查找和对半搜索,即对于升序(或者降序)的有序序列进行查找时,由于有序我们可以直接从中间查找相等返回。大于则在右侧子序列中进行二分查找,小于则对左侧子序列进行二分查找。直至找到或者子序列只有一个元素为止。代码实现迭代方法实现public int binSearch(int[] nums, int target) { int index, low = 0, hight=nums.length-1; wh原创 2021-09-13 11:42:50 · 1408 阅读 · 0 评论 -
十大排序算法之堆排序
十大排序算法之堆排序本文采用Java书写选择排序,其他语言类似可以借鉴着写原创 2021-09-13 00:23:35 · 1337 阅读 · 1 评论 -
十大排序算法之快速排序(两种方法)
十大排序算法之快速排序本文采用Java书写选择排序,其他语言类似可以借鉴着写思想:原创 2021-08-29 21:12:28 · 1280 阅读 · 4 评论 -
荷兰国旗问题
荷兰国旗问题问题:给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于sum的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度为O(N)。由于荷兰的国旗是三个颜色刚好对应三个部分,因此也叫荷兰国旗问题。思路:引入两个具有指向性的变量,分别指向数组开头和结尾。i从数组开头进行遍历,如果小于sum则与指向开头的变量互换,变量指向右移,i++;如果等于sum,则仅执行i++;如果大于sum,则与指向结尾的变量互换位置,变量指向左移,不执行i++操作原创 2021-08-28 22:19:43 · 647 阅读 · 0 评论 -
逆序对问题
逆序对问题题目:所谓逆序对问题就是,在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对举例:1 3 4 2 5<1,3>、<1,4>、<1,2>、<1,5>、❤️,4>、❤️,5>、<4,5>、<2,5>代码实现普通的暴力破解为:N + N-1+ N-2 + N-3 + ···+ 1 时间复杂度为:O(N^2)借助归并排序可以实现时间复杂度为:O(N*logN)归并排序详解package原创 2021-08-28 10:19:44 · 772 阅读 · 0 评论 -
小和问题求解
小和问题题目:在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。举例:1 3 4 2 5小和为:1 + (1 + 3) + 1 + (1 + 3 + 4 + 2) = 16代码实现普通的暴力破解为:N + N-1+ N-2 + N-3 + ···+ 1 时间复杂度为:O(N^2)借助归并排序可以实现时间复杂度为:O(N*logN)归并排序详解package LeetCode;/** * @Description: * @ProjectNmae: gitTes原创 2021-08-28 00:16:04 · 795 阅读 · 0 评论 -
十大排序算法之归并排序
归并排序本文采用Java书写选择排序,其他语言类似可以借鉴着写思想1(正着想):将一个大的无序数组有序,我们可以把大的数组等分成两个,然后对这两个数组分别进行排序,之后在把这两个数组合并成一个有序的数组。思想2(反着想):待排序的n个元素,可以看作n个待合并的有序序列,每个序列只有一个元素。每次将两个相邻的序列合并为一个大的有序序列,重复合并过程直到剩下一个序列。两种其实核心思想是一样的只是理解不同。效果图:算法的复杂度和稳定性稳定性:归并排序值相等时不交换,因此具有稳定性复杂度:可原创 2021-08-27 23:33:05 · 646 阅读 · 0 评论 -
Master公式(计算递归复杂度)
Master公式在计算涉及递归的算法的时候,计算复杂度就会变得有些麻烦。Master公式就是用来进行剖析递归行为和递归行为时间复杂度的估算的Master公式:T(N) = a*T(N/b) + O(N^d)公式解释:n表示问题的规模,a表示递归的次数也就是生成的子问题数,N/b表示子问题的规模。O(N^d)表示除了递归操作以外其余操作的复杂度结论(证明省略):①当d<logb a时,时间复杂度为O(N^(logb a))②当d=logb a时,时间复杂度为O((N^d)*logN)③当原创 2021-08-27 22:33:08 · 5447 阅读 · 3 评论 -
十大排序算法之插入排序
插入排序本文采用Java书写选择排序,其他语言类似可以借鉴着写思想:由简单到复杂,多个数进行排序,我们可以考虑一个数,两个数慢慢增加进行排序。先排好N个数,让N+1个数跟前面N个数,从后往前进行比较,小于前面的数据则交换,直到前面没有数据或者大于等于前面的数据停止。效果图:下面效果图可形象表现出插入排序的过程。算法的复杂度和稳定性稳定性:插入排序值相等时不交换,因此具有稳定性复杂度:这里仅说明时间复杂度为:O(N^2)代码实现/** * @Description: 插入排序原创 2021-08-26 18:28:58 · 527 阅读 · 0 评论 -
十大排序算法之选择排序(内含动态流程图)
选择排序本文采用Java书写选择排序,其他语言类似可以借鉴着写思想:从待测数据中找到最小(大)值放在左端,然后再从剩下的待测数据中依次重复执行此操作。每次都选择最小的元素,确定个元素的位置。因此被称为选择排序。效果图:下面效果图可形象表现出选择排序的过程。算法的复杂度和稳定性稳定性:选择排序值相等时不交换,因此具有稳定性复杂度:这里仅说明时间复杂度为:O(N^2)代码实现/** * @Description: 选择排序 * @ProjectNmae: gitTest原创 2021-08-26 18:13:19 · 742 阅读 · 0 评论 -
十大排序算法之冒泡排序
冒泡排序本文采用Java书写冒泡排序,其他语言类似可以借鉴着写思想:冒泡排序的思想是相邻的元素两两比较,较小(大)的数下沉,较大(小)的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序效果图:下图可以很形象的表现冒泡排序的过程算法复杂度和稳定性稳定性:冒泡排序值相等时不交换,因此具有稳定性复杂度:这里仅仅来说明时间复杂度为:O(N^2)代码实现/** * @Description: 冒泡排序 * @PackageNa原创 2021-08-26 18:00:03 · 553 阅读 · 0 评论 -
提取一个二进制位最右侧的1
提取一个二进制位最右侧的1看左神的视频做个小记录,提取一个数最右侧的1借助一下题目:给你一个整数数组,里面只有两个数是出现奇数次,其余均出现偶数次,提取出这两个给数字public static int[] function(int[] arr){ int eor1 = 0, eor2 = 0; for (int i:arr) eor1 ^= i; int rightOne = eor1 & (~eor1 + 1); for (int i原创 2021-08-26 16:02:34 · 723 阅读 · 0 评论