본문 바로가기
Algorithm/LeetCode

[LeetCode] Algorithm I - Day 3 Two Pointers

by yunamom 2022. 10. 27.
728x90
300x250

Algorithm I - Day 3 Two Pointers

283. Move Zeroes

Given an integer array nums, move all 0's to the end of it while maintaining the relative order of the non-zero elements.

Note that you must do this in-place without making a copy of the array.

 

Example 1:

Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]

Example 2:

Input: nums = [0]
Output: [0]

 

Constraints:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1
class Solution {
    public void moveZeroes(int[] nums) {
        int index = 0;
        for(int i=0; i<nums.length; i++){
            if(nums[i] != 0){
                nums[index++] = nums[i];
            }
        }
        for(int i=index; i<nums.length; i++){
            nums[i] = 0;
        }
    }
}

 


167. Two Sum II - Input Array Is Sorted

Given a 1-indexed array of integers numbers that is already sorted in non-decreasing order, find two numbers such that they add up to a specific target number. Let these two numbers be numbers[index1] and numbers[index2] where 1 <= index1 < index2 <= numbers.length.

Return the indices of the two numbers, index1 and index2, added by one as an integer array [index1, index2] of length 2.

The tests are generated such that there is exactly one solution. You may notuse the same element twice.

Your solution must use only constant extra space.

 

Example 1:

Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore, index1 = 1, index2 = 2. We return [1, 2].

Example 2:

Input: numbers = [2,3,4], target = 6
Output: [1,3]
Explanation: The sum of 2 and 4 is 6. Therefore index1 = 1, index2 = 3. We return [1, 3].

Example 3:

Input: numbers = [-1,0], target = -1
Output: [1,2]
Explanation: The sum of -1 and 0 is -1. Therefore index1 = 1, index2 = 2. We return [1, 2].

 

Constraints:

  • 2 <= numbers.length <= 3 * 104
  • -1000 <= numbers[i] <= 1000
  • numbers is sorted in non-decreasing order.
  • -1000 <= target <= 1000
  • The tests are generated such that there is exactly one solution.
class Solution {
    public int[] twoSum(int[] numbers, int target) {
          int left=0,right=numbers.length-1;
    
        while(left<right){
            int sum=numbers[left]+numbers[right];
            if(sum==target){
                return new int[]{left+1,right+1};
            } 
            else if(sum>target){
                right--;
            }          
            else if(sum<target){
                left++;
            }              
        }
        return new int[]{};
    }
}

1   3   4   5   7   11
L                        R          sum = 1+11=12  > 9, so R--.
If we increase L, we will get 3+11 which is much greater than target(9) so that would be wrong.
Hence, we have to go backwards, i.e. R--, to decrease sum.

1   3   4   5   7   11
L                  R                sum=1+7=8  < 9, so L++. (Because we need to increase sum)

1   3   4   5   7   11
     L             R                sum=3+7=10  > 9, R--.  

1   3   4   5   7   11
    L         R                     sum=3+5=8  < 9, L++.

1   3   4   5   7   11
          L   R                     sum=4+5=9  == 9, Return.

728x90
300x250

코드