优选算法1:双指针
1.移动零
题目描述
算法思路
算法思路:我们可以先用一个变量dest遍历数组,cur停留在-1位置,通过dest遍历到的元数进行处理,让[ 0 ,cur ] 全是非零元素,[ cur+1,dest-1]全是0。
算法流程:先让cur = 0;dest = -1,然后再让dest遍历数组,当dest下标元素非零时,让cur++,然后将cur所指向的值和dest交换,就完成了一次搬运,将此过程重复。
算法实现
2.复写零
题目描述
算法思路
1)定义两个指针:left,rijht,先要找到最后一个复写数,再从最后一个复写数开始判断,此时right指向最后一个复写数,left在数组最后一个数上。
1.1要找到最后一个复写数,就要先让left = -1,right = 0,让right作为“扫描”判断下标指的数是否为0,当为0时left走两步,否着走一步,当left>=数组长度时,跳出循环,此时right就找到最后一个复写数。
2)判断极端情况
当倒数第二个数是0时,此时left会大于数组长度,而我们就让arr[--left] = 0,倒数第一个数为0,然后left和right都 --。
3)最后从后往前遍历,当right != 0 时,就让left的值等于right的值,等于0就让left前两个 数为0。
算法实现
3.快乐数
题目描述
算法思路
双指针不是只用于数组,可以定义一个快慢指针,让两个指针前进,因为两个指针走的路相同,所以在进入循环前是不会相同的,那么当两个指针的值相同时,此时就满足相同的情况。
算法实现
4.盛水最多的容器
题目描述
算法思路
1)给定的一段数组,要去判断两端,指定两个指针。
2)从较短的一端为例,体积是长度乘上高度,当短的一段向里运动时,长度减小,当里面的高度小于运动端的长度,高度减小,此时体积减小;当里面的高度大于外面时,此时里面的水高度不变,体积减小。那么就不需要较小的那一端。
3)让两个指针一个从头开始,一个从尾开始,先计算体积,当计算完后较小的那一短移动。
算法实现
查找和为T的两个数
题目描述
算法思路
设定两个指针,right和left,一个等于数组长度,一个为0,两个指针对应下标相加,因为数组是序数组,当相加大于target时,right加任何数都是大于,此时让right--;小于就让left++。