目录
26. 删除排序数组中的重复项Remove Duplicates (easy)
80. 删除排序数组中的重复项 IIRemove Duplicates (easy)
977. 有序数组的平方Squaring a Sorted Array (easy)
Triplet Sum Close to Target (medium)
Triplets with Smaller Sum (medium)
713. 乘积小于K的子数组Subarrays with Product Less than a Target (medium)
Dutch National Flag Problem (medium)
双指针是这样的模式:两个指针朝着左右方向移动(双指针分为同向双指针和异向双指针),直到他们有一个或是两个都满足某种条件。双指针通常用在排好序的数组或是链表中寻找对子。比如,你需要去比较数组中每个元素和其他元素的关系时,你就需要用到双指针了。
我们需要双指针的原因是:如果你只用一个指针的话,你得来回跑才能在数组中找到你需要的答案。这一个指针来来回回的过程就很耗时和浪费空间了+—+这是考虑算法的复杂度分析的时候的重要概念。虽然brute+force一个指针的解法可能会奏效,但时间复杂度一般会是O(n²)。在很多情况下,双指针能帮助我们找到空间或是时间复杂度更低的解。
判断使用双指针:
- 一般来说,数组或链表是排好序的,你需要在里面找一些组合满足某种限制条件
- 这种组合可能是一对数,三个数,或是一个子数组
力扣经典题
网上流传的力扣分类的经典题,我找的对应的中文题目,若有不全,不对请指正。
Pair with Target Sum (easy)
26. 删除排序数组中的重复项Remove Duplicates (easy)
//双指针
class Solution {
public int removeDuplicates(int[] nums) {
int left=0,right=0;
int len=nums.length;
while(right<len){
while(right<len&&nums[left]==nums[right]){
right++;
}
if(right<len){
left++;
nums[left]=nums[right];
}
}
return left+1;
}
}
class Solution {
public int removeDuplicates(int[] nums) {
int len=nums.length;
if(len==0||len==1){
return len;
}
int l=0,r=1;
while(r<len){
if(nums[l]==nums[r]){
r++;
}else{
l++;
nums[l]=nums[r];
}
}
return l+1;
}
}
80. 删除排序数组中的重复项 IIRemove Duplicates (easy)
class Solution {
public int removeDuplicates(int[] nums) {
int left=0,right=0;
int len=nums.length;
while(right<len){
boolean x=true;//左指针右移一位
if(right+1<len&&nums[right]==nums[right+1]){
x=false;//移两位
}
int temp=nums[right];
while(right<len&&nums[right]==temp){
right++;
}
if(x){
nums[left]=temp;
left++;
}else{
nums[left]=temp;
left++;
nums[left]=temp;
left++;
}
}
return left;
}
}
977. 有序数组的平方Squaring a Sorted Array (easy)
//左右指针在数组两端,向中间移动,两者比较 大的入数组,最后返回数组的逆序(也可以直接逆着放入数组)
class Solution {
public int[] sortedSquares(int[] A) {
int len=A.length;
int[] ans=new int[len];
int left=0,right=len-1;
while(left<=right){
if(A[left]*A[left]<=A[right]*A[right]){
ans[right-left]=A[right]*A[right];
right--;
}else{
ans[right-left]=A[left]*A[left];
left++;
}
}
return ans;
}
}
Triplet Sum to Zero (medium)
Triplet Sum Close to Target (medium)
Triplets with Smaller Sum (medium)
713. 乘积小于K的子数组Subarrays with Product Less than a Target (medium)
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
if (k <= 1) return 0;
int prod = 1, ans = 0, left = 0;
for (int right = 0; right < nums.length; right++) {
prod *= nums[right];
while (prod >= k) prod /= nums[left++];
ans += right - left + 1;
}
return ans;
}
}