Cindy's Blog

アマゾンで働いているエンジニアの日常

LeetCode 283. Move Zeroes

Follow up: Could you minimize the total number of operations done?

https://leetcode.com/problems/move-zeroes/

    //firstZeroIndex -> z
// z: -1
    // i
    //[1,3,12,0,0]
    //when nums[i] = 0
       //if z = -1, then z = i
    //else
       //if z != -1 (had zero in front)
       // swap
      // z += 1;
    //from z ~ i as t, nums[t] = 0 is promised
    

class Solution {
    public void moveZeroes(int[] nums) {
        int firstZeroIndex = -1;
        for (int i = 0; i < nums.length; i++){
            if (nums[i] == 0){
                if (firstZeroIndex == -1){
                    firstZeroIndex = i;
                }
            } else {
                if (firstZeroIndex != -1){
                    int temp = nums[firstZeroIndex];
                    nums[firstZeroIndex] = nums[i];
                    nums[i] = temp;
                    
                    firstZeroIndex += 1;
                }
            }
        }
    }
}

LeetCode 200. Number of Islands

UnionFind island count direction

https://leetcode.com/problems/number-of-islands/

class Solution {
    public int numIslands(char[][] grid) {
        int rows = grid.length;
        int cols = grid[0].length;
        
        int countIslands = 0;
        int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
        UnionFind uf = new UnionFind(rows * cols);
        
        for (int x = 0; x < rows; x++){
            for (int y = 0; y < cols; y++){
                if (grid[x][y] == '1') {
                    countIslands++;
                }
            }
        }
        
        for (int x = 0; x < rows; x++){
            for (int y = 0; y < cols; y++){
                if (grid[x][y] == '1'){
                    for (int[] dir : directions) {
                        int nx = x + dir[0];
                        int ny = y + dir[1];
                        if (nx >= 0 && nx < rows && ny >= 0 && ny < cols && grid[nx][ny] == '1'){
                            if (uf.merge(x * cols + y, nx * cols + ny)){
                                countIslands--;
                            }
                        }
                    }
                }
            }
        }
        
        return countIslands;
        
    }
}

class UnionFind{
    int[] father;
    public UnionFind(int size){
        father = new int[size];
        for (int i = 0; i < size; i++){
            father[i] = i;
        }
    }
    
    public int getFather(int x){
        if (father[x] == x){
            return x;
        }
        return father[x] = getFather(father[x]);
    }
    
    public boolean isSameFather(int a, int b){
        int fa = getFather(a);
        int fb = getFather(b);
        return fa == fb;
    }
    
    public boolean merge(int a, int b){
        int fa = getFather(a);
        int fb = getFather(b);
        if (fa == fb) return false;
        father[fa] = fb;
        return true;
    }
}

LeetCode 392. Is Subsequence

Easy question

https://leetcode.com/problems/is-subsequence/

class Solution {
    public boolean isSubsequence(String s, String t) {
        int sIndex = 0;
        int tIndex = 0;
        while (sIndex < s.length() && tIndex < t.length()){
            //"abc"
        //      s
            //"ahbcgd"
       //       t
            
            int target = s.charAt(sIndex);
            if (t.charAt(tIndex) == target){
                tIndex += 1;
                sIndex += 1;
            } else {
                tIndex += 1;
            }
            
        }
        
        if (sIndex == s.length()){
            return true;
        }
        return false;
    }
}

LeetCode 20. Valid Parentheses

Considering with following cases "]" "{[}]"

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            
            if (c == '(' || c == '[' || c == '{'){
                stack.push(c);
            } else if (stack.size() == 0){
                return false;
            } else if (c == ')' && stack.pop() != '('){
                return false;
            } else if (c == ']' && stack.pop() != '['){
                return false;
            } else if (c == '}' && stack.pop() != '{'){
                return false;
            }
        }

        return stack.size() == 0;
    }
}

LeetCode 967. Numbers With Same Consecutive Differences

interestring question.

The order of calculation is very important.

class Solution {
    public int[] numsSameConsecDiff(int n, int k) {
        //10 ^ n => max 10^9..
        List<Integer> answer = new ArrayList<>();
        
        for (int lastDigit = 1; lastDigit <= 9; lastDigit++){
            findAnswer(n, k, 1, lastDigit, lastDigit, answer);
        }
        
        int[] finalAnswer = new int[answer.size()];
        for (int i = 0; i < answer.size(); i++){
            finalAnswer[i] = answer.get(i);
        }
        
        return finalAnswer;
    }
    
    private void findAnswer(int n, int k, int digit, int lastDigit, int currentNumber, List<Integer> answer){
        if (digit == n){
            answer.add(currentNumber);
            return;
        }
        
        if (lastDigit - k >= 0 && k != 0){
            findAnswer(n, k, digit + 1, lastDigit - k, currentNumber * 10 + lastDigit - k, answer);
        }
       
        if (lastDigit + k < 10)  {
            findAnswer(n, k, digit + 1, lastDigit + k, currentNumber * 10 + lastDigit + k, answer);
        }
    }
}

LeetCode 213. House Robber II

Very interesting question 0 ~ n - 2 また 1 ~ n -1 に2つに分けることを思いつかなかったな。

class Solution {
    public int rob(int[] nums) {
        
        int n = nums.length;
        if (n <= 3){
            int max = 0;
            for (int i = 0; i < n; i++){
                max = Math.max(nums[i], max);
            }
            return max;
        }
        
        return Math.max(findMaxSum(nums, 0, n - 1), findMaxSum(nums, 1, n));
       
    }
    
    private int findMaxSum(int[] nums, int start, int end){
        int prev = 0;
        int beforePrev = 0;
        
        for (int i = start; i < end; i++){
            //prev -> beforePrev
            //prev -> new max
            int temp = prev;
            //rob or not
            prev = Math.max(beforePrev + nums[i], prev);
            beforePrev = temp;
        }
        
        return prev;
    }
}

LeetCode 605. Can Place Flowers

https://leetcode.com/problems/can-place-flowers/

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        //max: 0 adjacent 1
        //dont create like this: [1, 0, 0, 1, 0, 0, 1] and do like this [1,0,1,0,0,0,1], then we can put one more flower in the flower bed
        
       
        
        if (flowerbed.length == 1){
            //n >= 1;
            if (n >= 1 && flowerbed[0] == 1) return false;
            return true;
        }
        
         //find if maximum is >= n;
        int max = 0;
        int size = flowerbed.length;
        //size is bigger than 1
        for (int i = 0; i < size; i++){
            if (flowerbed[i] == 1){
                continue;
            }
            
            if (i == 0){
                max += flowerbed[i + 1] == 0? 1: 0;
                flowerbed[i] = 1;
            } else if (i == size - 1){
                max += flowerbed[i - 1] == 0? 1:0;
                flowerbed[i] = 1;
            } else if (flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0){
                max += 1;
                flowerbed[i] = 1;
            }
            
        }
        
        System.out.print(max);
        return max >= n;
    }
}