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; } }