双指针使用条件
0. 总结:
-- - 有两个数组或者链表的,
-- - 或者一个数组但是要求让你干的事可以从首尾一起干的,
-- - 又或者一个数组,可以从中间和两端都一起干的那种,都可以用双指针
1. 腚眼一瞅,可以从两边往里搞那种,比如:11
2. 链表奇奇怪怪,题目有俩链表那种:160 ,一根链表也问:876 ,估计也就这一道题
3. 链表有环的:141 、142
4. 要求原地操作,只可以使⽤交换,不能使⽤额外空间: 344
5. 有的时候你想的话,也有三个指针的,比如:面试题 10.01 和88 题
6. 还有的是双指针指在左右和中间动态的k上比如:189 ,题目中的特殊的值作为指针
7. 指针是动态再加动态:15
例题
var hasCycle = function ( head ) {
let slow = head, fast = head;
while ( fast && fast. next) {
slow = slow. next;
fast = fast. next. next;
if ( slow == fast) {
return true ;
}
}
return false ;
} ;
var detectCycle = function ( head ) {
let fast = head, slow = head;
while ( fast) {
if ( fast. next == null ) return null ;
fast = fast. next. next;
slow = slow. next;
if ( fast == slow) {
fast = head;
while ( fast !== slow) {
fast = fast. next;
slow = slow. next
}
return fast
}
}
return null
} ;
var threeSum = function ( nums ) {
let ans = [ ] ;
let len = nums. length;
if ( len < 3 ) return ans;
nums. sort ( ( a, b ) => a- b) ;
for ( let i = 0 ; i < len; i++ ) {
if ( nums[ i] > 0 ) return ans;
if ( nums[ i] == nums[ i - 1 ] ) continue
let l = i + 1 ;
let r = len - 1 ;
while ( l < r) {
let sum = nums[ i] + nums[ l] + nums[ r] ;
if ( sum == 0 ) {
ans. push ( [ nums[ i] , nums[ l] , nums[ r] ] )
while ( nums[ l] == nums[ l + 1 ] ) l++ ;
while ( nums[ r] == nums[ r - 1 ] ) r-- ;
l++ ;
r-- ;
}
else if ( sum < 0 ) l++ ;
else if ( sum > 0 ) r-- ;
}
}
return ans
} ;
var maxArea = function ( height ) {
let i = 0 , j = height. length - 1 ; ans = 0 ;
while ( i < j) {
let tmp = Math. max ( ans, ( j - i) * ( Math. min ( height[ i] , height[ j] ) ) )
if ( height[ i] < height[ j] ) {
ans = tmp;
i++ ;
} else if ( height[ i] >= height[ j] ) {
ans = tmp;
j-- ;
}
}
return ans
} ;
var getIntersectionNode = function ( headA, headB ) {
if ( headA == null || headB == null ) {
return null
}
let a = headA, b= headB;
while ( a !== b) {
a = a === null ? headB : a. next;
b = b === null ? headA : b. next;
}
return b
} ;
var middleNode = function ( head ) {
let slow= head, fast = head;
while ( fast && fast. next) {
slow = slow. next;
fast = fast. next. next;
}
return slow
} ;
var reverseString = function ( s ) {
let l = 0 , r = s. length - 1 ;
while ( l < r) {
[ s[ l] , s[ r] ] = [ s[ r] , s[ l] ]
l++
r--
}
return s
} ;
var isPalindrome = function ( s ) {
s = s. toLowerCase ( ) ;
let l = 0 , r = s. length - 1 ;
while ( l < r) {
if ( ! isValid ( s[ l] ) ) { l++ ; continue } ;
if ( ! isValid ( s[ r] ) ) { r-- ; continue } ;
if ( s[ l] != s[ r] ) return false ;
l++ ;
r-- ;
}
return true
} ;
var isValid = function ( char ) {
return ( char >= "a" && char <= "z" ) || ( char >= "0" && char <= "9" )
}
var isSubsequence = function ( s, t ) {
let n = s. length, m = t. length;
let i = 0 , j = 0 ;
while ( i < n && j < m) {
if ( s[ i] == t[ j] ) i++ ;
j++
}
return i == n
} ;
var merge = function ( nums1, m, nums2, n ) {
let m1 = m - 1 , n1 = n - 1 , cur = n + m - 1 ;
while ( m1 > - 1 && n1 > - 1 ) {
if ( nums1[ m1] >= nums2[ n1] ) {
nums1[ cur] = nums1[ m1] ;
cur-- ;
m1-- ;
} else if ( nums1[ m1] < nums2[ n1] ) {
nums1[ cur] = nums2[ n1] ;
cur-- ;
n1-- ;
}
}
if ( n1 != - 1 ) {
for ( let i = 0 ; i <= n1; i++ ) {
nums1[ i] = nums2[ i]
}
}
return nums1
} ;
var sortColors = function ( nums ) {
let zero = 0 , one = 0 , two = 0 ;
for ( let i = 0 ; i < nums. length; i++ ) {
let tmp = nums[ i] ;
nums[ two++ ] = 2 ;
if ( tmp <= 1 ) {
nums[ one] = 1 ;
one++ ;
}
if ( tmp == 0 ) {
nums[ zero] = 0 ;
zero++ ;
}
}
} ;
var moveZeroes = function ( nums ) {
let index = 0 ;
for ( let i = 0 ; i < nums. length; i++ ) {
if ( nums[ i] != 0 ) {
nums[ index] = nums[ i] ;
index++
}
}
while ( index < nums. length) {
nums[ index] = 0 ;
index++
}
} ;
var rotate = function ( nums, k ) {
rotateArr ( nums, 0 , nums. length - 1 ) ;
k = k % nums. length;
rotateArr ( nums, 0 , k- 1 ) ;
rotateArr ( nums, k, nums. length - 1 ) ;
return nums
} ;
var rotateArr = function ( nums, start, end ) {
while ( start < end) {
[ nums[ start] , nums[ end] ] = [ nums[ end] , nums[ start] ] ;
start++ ;
end-- ;
}
return nums
}
var merge = function ( A , m, B , n) {
for ( let i = m; i < m + n; i++ ) {
A [ i] = B [ i- m]
}
A . sort ( ( a, b ) => a - b)
} ;
var merge = function ( A , m, B , n) {
var merge = function ( A , m, B , n) {
let m1 = m - 1 , n1 = n - 1 , cur = m + n - 1 ;
while ( ( m1 > - 1 ) && ( n1 > - 1 ) ) {
if ( A [ m1] >= B [ n1] ) {
A [ cur] = A [ m1] ;
cur-- ;
m1-- ;
} else if ( A [ m1] < B [ n1] ) {
A [ cur] = B [ n1] ;
cur-- ;
n1-- ;
}
}
if ( n1 != - 1 ) {
for ( let i = 0 ; i <= n1; i++ ) {
A [ i] = B [ i]
}
}
return A
} ;