双指针
秦枫-_-
慵懒的程序猿
展开
-
等差数列划分(双指针or差分)
滑动窗口优化:双指针O(N),i-idx-1之间是一个等差数列,那么求它的等差子数组即可,最小的等差子数组长度为3,数量为len-3+1,最长的等差子数组长度为len,数量为1,那么他子数组的数量也是一个等差为1的等差数列,套用等差数列求和公式,最后i不必从最开始查起,直接跳转到idx-2处 以idx-2为首查等差数列长度即可class Solution { public int numberOfArithmeticSlices(int[] nums) { if(nums.length.原创 2021-08-10 11:21:43 · 149 阅读 · 1 评论 -
判断环形数组是否存在循环
这道题解读:首先是 给定的数组一定有环,但是这个环不能是自环且必须是「同向」才合法,因此如果我们在遍历过程中发现存在反向,就停止检查,并且把存在反向环的节点都标记为0,如此以后在遇到这些点就可以直接跳过,因为题目给定的每个点都只有一个唯一的出路,所以不用担心会判断错误具体地,我们检查每一个节点,令快慢指针从当前点出发,快指针每次移动两步,慢指针每次移动一步,期间每移动一次,我们都需要检查当前单向边的方向是否与初始方向是否一致,如果不一致,我们即可停止遍历,因为当前路径必然不满足条件。如果在一个符合题意.原创 2021-08-07 19:08:04 · 286 阅读 · 1 评论 -
有效三角形的个数(双指针或二分法)(和三数之和一模一样的思路)
力扣链接:链接: 力扣.class Solution { public int triangleNumber(int[] nums) { int ans=0; Arrays.sort(nums); for(int i=nums.length-1;i>=2;i--){ int x3=nums[i]; int j=i-1,k=0; while(k<j){ if(nums[k]+nums[j.原创 2021-08-04 22:17:59 · 131 阅读 · 1 评论