目录方法一:双指针法 方法二:动态规划方法三:单调栈42.接雨水-力扣(LeetCode) 黑色的是柱子,蓝色的是雨水,我们先来观察一下雨水的分布情况:雨水落在凹槽之间,在一个凹槽的左右都会有两个柱子,两个柱子高度可能相同也可能不同,柱子的高低决定了凹槽的雨水的高度,雨水的高度等于两个柱子较低的高度。方法一:双指针法时间复杂度:O(N^2);空间复杂度:O(1);缺点:会超时;思想:统计各个所在位置的左边最高高度和右边最高位置(第一个和最后一个柱子所在位置不用统计,他们不可能会接收雨水),然后算出各个位置雨水面积(两边的最高高度的较小值-当前位置的柱子的面积),最后将各个位置的面积相加得到总面
快速排序介绍: 快速排序是一种非常常用的排序方法,它在1962由C.A.R.Hoare(霍尔)提的一种二叉树结构的交换排序方法,故因此它又被称为霍尔划分,它基于分治的思想,所以整体思路是递归进行的。整体思路:1.先选取一个key,关于key值的选取,一般是选数组第一个元素,数组中间元素,数组最后一个元素,这三个元素的中间值,并将这个元素与数组第一个元素进行交换。2.将key放入整个区间中正确的位置,即为key左边的元素都比key小,右边的元素都比key要大,此时的key就是它排好序的位置,注意key左边的元素都比它小,但不一定有序,右边也是一样,然后根据递归的思想,再对key左边的区间进行上面
双指针是一种思想或一种技巧并不是特别具体的算法。具体就是用两个变量动态存储两个结点,来方便我们进行一些操作。通常用在线性的数据结构中。三数之和给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。题解:classSolution{/***思路:*设定:需要找到3个数,a+b+c=0,这里abc三个数的下标从左到右*定义a的下标为i,b的下标为left,c的下标为right*首先,对数组进
前言 可能有粗心写的不正确的地方,或者因为技术有限写得不好的地方,欢迎大家批评指正,文章中给出的代码是本人自己写的leetcode中的代码,是代码的核心部分,如果放到本地编译器中,可能要加入mian()函数等内容。题目1二分查找LeetCode704二分查找题目要点 二分查找的思路非常简单,也就是我们常说的折半查找,比较经典的生活中的例子就是我们平时玩的猜数游戏,我们都知道,当给定一个数字范围的时候,我们应该先去猜它的正中间,这样就可以直接缩小一半的范围,二分查找用的就是这个原理,它的思路大体(左闭右闭)如下图所示: 我们可以知道,二分查找的思路非常简单,但是写的时候却经常容易漏洞百出,
双指针法有三种:左右指针法(头尾指针法)快慢指针法滑动窗口左右指针法左右指针法是最常见的双指针法,左右两端两个指针相向而行。一般针对有序数组找目标值有奇效,经典的题目案例就是多数之和。N数之和的问题如果用朴素解法(暴力解法)时间复杂度肯定为O(n^N)。(n位数数组元素的个人,N为N个数之和)当然还有不少类似问题能用双指针法,比如反转数组等,不一一举例。举例一道中等的三数之和吧。三数之和给你一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0?请你找出所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。classSolution{functh
目录1.hoare法方法与步骤代码实现2.挖坑法方法与步骤代码实现3.前后指针法方法与步骤代码实现 4.快速排序的缺点与优化1.快速排序的缺点2.快速排序的优化①三数取中法选key代码实现②小区间优化代码实现5.快速排序的非递归实现附录﹡完整源码快速排序递归实现快速排序非递归实现快速排序是霍尔大佬在1962年提出的排序方法,因其出色的排序效率使得它成为使用最广泛的排序算法。快速排序之所以敢叫做快速排序,自然是有一定的道理,今天我们就来看看快速排序是如何凌驾于其它算法之上的。快速排序的基本思想是:任取待排序数列中的一个数作为key值,通过某种方法使得key的左边所有的数都比它小,右边的数都比它大
目录1、常见的排序算法1.1交换排序基本思想2、快速排序的实现方法2.1基本思想3hoare(霍尔)版本3.1实现思路3.2思路图解3.3为什么实现思路的步骤2、3不能交换3.4hoare版本代码实现3.5hoare版本代码测试4、挖坑法4.1实现思路4.2思路图解4.3挖坑法代码实现4.4挖坑法代码测试5、前后指针版本5.1实现思路5.2思路图解5.3前后指针法代码实现5.4前后指针法代码测试6、时间复杂度分析6.1最好情况6.2最坏情况7、优化快速排序7.1选key优化7.2小区间优化1、常见的排序算法1.1交换排序基本思想冒泡排序属于交换排序之一,我们先来了解以下冒泡排序思想。基本思想:
第一题四数之和一开始还是只能想到说是四重循环但是我估计肯定不行另外这个题的主要思想就是用两个循环去解决4个循环的暴力解法 我一上来想的是去用四个multimap去存储ABCD但那样是不行的因为:使用四个multimap存储A、B、C和D的元素,然后进行四个循环,其实就是一种暴力解法。对于每一个a、b、c和d的组合,你都需要检查它们的和是否为0。这种方法的时间复杂度是O(n⁴),因为你需要遍历A、B、C和D中的所有元素四元组。虽然multimap可以按照键(key)进行排序并快速查找特定的键,但这并不能改变你需要遍历所有四元组的事实。只有当你需要查找或删除特定键的元素时,multimap的特性才
文章目录01|👑题目描述02|🔋解题思路STL法双指针法03|🧢代码片段STL法双指针法“Successisnotfinal,failureisnotfatal:Itisthecouragetocontinuethatcounts.”-WinstonChurchill(成功并非终点,失败并非致命:真正重要的是继续前行的勇气-温斯顿·丘吉尔)01|👑题目描述给你一个整数数组,数组中的数可以是正数、负数、零,请实现一个函数,返回这个数组中所有数的平方值中有多少种不同的取值对于这个题目的理解是,给定一个整数数组,我们需要找出数组中所有数的平方值中有多少种不同的取值。换句话说,我们需要统计数组中平方值
今天是第一天在代码随想录算法训练营打卡,也是第一次在力扣上刷题,直接为我打开了新世界的大门,那么从今天开始我也会不断分享记录一些解题思路和心得,同时也作为鞭策我不断前行的动力。那么话不多说,回到正题,今天写了704.二分查找和27.移除元素,这两道题都是比较简单的,但所使用的解题思路是很重要的,涉及了二分法以及双指针法,这都是我们必须掌握的方法。首先看二分查找这道题题目如下:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9