JAVA刷题记录:专题一 双指针

283. 移动零 - 力扣(LeetCode)

class Solution {
    public void moveZeroes(int[] nums) {
        for(int dest = -1, cur = 0; cur < nums.length; cur++) {
            if(nums[cur] != 0) {
                dest++;
                int tmp = nums[cur];
                nums[cur] = nums[dest];
                nums[dest] = tmp;
            }
        }
    }
}

1089. 复写零 - 力扣(LeetCode)

class Solution {
    public void duplicateZeros(int[] arr) {
        int dest = -1, cur = 0, n = arr.length;
        while(cur < n) {
            if(arr[cur] == 0) {
                dest += 2;
            } else {
                dest++;
            }
            if(dest >= n -1) break;
            cur++;
        }
        if(dest == n) {
            arr[n - 1] = 0;
            dest -= 2;
            cur--;
        }
        while(cur >= 0) {
            if(arr[cur] != 0) {
                arr[dest--] = arr[cur--];
            } else {
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }
        }
    }
}

202. 快乐数 - 力扣(LeetCode)

class Solution {
    public int f(int n) {
        int sum = 0;
        while(n != 0) {
            int t = n % 10;
            sum += t * t;
            n /= 10;
        }
        return sum;
    }

    public boolean isHappy(int n) {
        int slow = n, fast = f(n);
        while(slow != fast) {
            slow = f(slow);
            fast = f(f(fast));
        }
        return slow == 1;
    }
}

11. 盛最多水的容器 - 力扣(LeetCode)

class Solution {
    public int maxArea(int[] height) {
        int left = 0, right = height.length - 1, ret = 0;
        while(left < right) {
            ret = Math.max(ret, Math.min(height[left], height[right]) * (right - left));
            if(height[left] > height[right]) right--;
            else left++;
        }
        return ret;
    }
}

611. 有效三角形的个数 - 力扣(LeetCode)

class Solution {
    public int triangleNumber(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length, ret = 0;
        for(int c = n - 1; c >= 2; c--){
            int left = 0, right = c - 1;
            while(left < right) {
                if(nums[left] + nums[right] > nums[c]) {
                    ret += right - left;
                    right--;
                } else {
                    left++;
                }
            }
        }
        return ret;
    }
}

LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

class Solution {
    public int[] twoSum(int[] price, int target) {
        int left = 0, right = price.length - 1;
        while(left < right) {
            if(price[left] + price[right] < target) left++;
            else if(price[left] + price[right] > target) right--;
            else return new int[]{price[left], price[right]};
        }
        return null;
    }
}

15. 三数之和 - 力扣(LeetCode)

class Solution {
    public List> threeSum(int[] nums) {
        List> ret = new ArrayList<>();
        Arrays.sort(nums);
        int n = nums.length;
        for(int i = 0; i < n && nums[i] <= 0; ) {
            int left = i + 1, right = n - 1, target = -nums[i];
            while(left < right) {
                if(nums[left] + nums[right] > target) right--;
                else if(nums[left] + nums[right] < target) left++;
                else {
                    ret.add(new ArrayList(Arrays.asList(nums[i], nums[left], nums[right])));
                    left++;
                    right--;
                    while(nums[left] == nums[left - 1] && left < right) left++;
                    while(nums[right] == nums[right + 1] && left < right) right--;
                }
            }
            i++;
            while( i < n && nums[i] == nums[i - 1]) i++;
        }
        return ret;
    }
}
class Solution {
    public List> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List> ret = new ArrayList<>();
        int n = nums.length;
        for(int i = 0; i < n; ) {
            for(int j = i + 1; j < n; ) {
                int left = j + 1, right = n - 1;
                long aim = (long)target - nums[i] - nums[j];
                while(left < right) {
                    int sum = nums[left] + nums[right];
                    if(sum > aim) right--;
                    else if(sum < aim) left++;
                    else {
                        ret.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
                        left++;
                        right--;
                        while(left < right && nums[left] == nums[left - 1])left++;
                        while(left < right && nums[right] == nums[right + 1])right--;
                    }
                }
                j++;
                while(j < n && nums[j] == nums[j - 1]) j++;
            }
            i++;
            while(i < n && nums[i] == nums[i - 1]) i++;
        }
        return ret;
    }
}

你可能感兴趣的:(java,算法,leetcode)