记录刷题过程。
双指针
这里的双指针我理解的是从两端开始,从而减少循环次数。一般我们循环都是从某一个端点移向另一个端点,如果从两端向中间移动,有点分而治之的思想在里面。例如当你要遍历数组时,正常都是用 for 循环遍历:
for(int i=0; i<arr.length; i++) {sout(arr[i]);}
但是用双指针,就从两边开始,会快很多:
// 这里数组arr长度是偶数int i=0,j=arr.length -1;while (i<j){System.out.println(arr[i]);System.out.println(arr[j]);i++;j--;}
具体在题目中的应用:
题目:盛最多水的容器
链接:https://leetcode-cn.com/problems/container-with-most-water/
用暴力破解法:
public static int f1(int[] nums) {int r = 0;for (int i = 0; i < nums.length; i++) {for (int j = i+1; j < nums.length; j++) {// i = x1, j = x2 , nums[i] = y1, nums[j] = y2int x = j - i;int y = Math.min(nums[i],nums[j]);r = Math.max(r,x*y);}}return r;}
用双指针:
public static int f2(int[] nums) {int r = 0,i = 0,j = nums.length-1;while (i < j) {if (nums[i] > nums[j]) {r = Math.max(r,(j - i) * nums[j--]);}else {r = Math.max(r,(j - i) * nums[i++]);}}return r;}
