Thought:
Find the largest index whose value is not more than target.
Code:
public class Solution {
public int[] searchRange(int[] A, int target) {
int[] ret = new int[2];
ret[0] = helper(A, target - 1);
ret[1] = helper(A, target);
if (ret[1] != -1 && A[ret[1]] == target) ret[0]++;
if (ret[0] != -1 && A[ret[1]] != target) ret[0] = ret[1] = -1;
return ret;
}
public int helper (int[] a, int x) {
int start = 0;
int end = a.length - 1;
int mid = (start + end)/2;
int result = -1;
while (start <= end) {
if (a[mid] > x) {
end = mid - 1;
mid = (start + end)/2;
}else {
start = mid + 1;
result = mid;
mid = (start + end)/2;
}
}
return result;
}
}
Wednesday, March 27, 2013
[LeetCode] Search in Rotated Sorted Array
Thought:
Binary Search with different condition.
Code:
public class Solution {
public int search(int[] A, int target) {
int start = 0;
int end = A.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (A[mid] == target) return mid;
if (A[start] > A[mid]) {
if (A[mid] <= target && target <= A[end]) start = mid + 1;
else end = mid - 1;
}else {
if (A[start] <= target && target <= A[mid]) end = mid - 1;
else start = mid + 1;
}
}
return - 1;
}
}
Binary Search with different condition.
Code:
public class Solution {
public int search(int[] A, int target) {
int start = 0;
int end = A.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (A[mid] == target) return mid;
if (A[start] > A[mid]) {
if (A[mid] <= target && target <= A[end]) start = mid + 1;
else end = mid - 1;
}else {
if (A[start] <= target && target <= A[mid]) end = mid - 1;
else start = mid + 1;
}
}
return - 1;
}
}
[LeetCode] Search in Rotated Sorted Array II
Thought:
Update the condition. This will change the Time to O(n).
Code:
public class Solution {
public boolean search(int[] A, int target) {
int start = 0;
int end = A.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (A[mid] == target) return true;
if (A[start] > A[mid]) {
if (A[mid] <= target && target <= A[end]) start = mid + 1;
else end = mid - 1;
}else if (A[start] < A[mid]){
if (A[start] <= target && target <= A[mid]) end = mid - 1;
else start = mid + 1;
}else {
start++;
}
}
return false;
}
}
Update the condition. This will change the Time to O(n).
Code:
public class Solution {
public boolean search(int[] A, int target) {
int start = 0;
int end = A.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (A[mid] == target) return true;
if (A[start] > A[mid]) {
if (A[mid] <= target && target <= A[end]) start = mid + 1;
else end = mid - 1;
}else if (A[start] < A[mid]){
if (A[start] <= target && target <= A[mid]) end = mid - 1;
else start = mid + 1;
}else {
start++;
}
}
return false;
}
}
Tuesday, March 26, 2013
[LeetCode] Sqrt(x)
Thought:
It is a Binary Search.
Code:
public class Solution {
public int sqrt(int x) {
if (x == 0) return 0;
int result = 2;
int tmp = 1;
while ( !(result <= x/result && result + 1 > x/(result + 1)) ) {
if (result < x/result) {
tmp = result;
result = result * result;
}else {
result = (result + tmp) / 2;
}
}
return result;
}
}
It is a Binary Search.
Code:
public class Solution {
public int sqrt(int x) {
if (x == 0) return 0;
int result = 2;
int tmp = 1;
while ( !(result <= x/result && result + 1 > x/(result + 1)) ) {
if (result < x/result) {
tmp = result;
result = result * result;
}else {
result = (result + tmp) / 2;
}
}
return result;
}
}
[LeetCode] Word Ladder
Thought:
It is a BFS problem.
Code:
import java.util.*;
public class Solution {
public int ladderLength(String start, String end, HashSet<String> dict) {
LinkedList<String> q1 = new LinkedList<String>(); // as a queue
LinkedList<Integer> q2 = new LinkedList<Integer>(); // as a queue
q1.offer(start);
q2.offer(1);
dict.remove(start);
while (!q1.isEmpty()) {
String current = q1.poll();
int depth = q2.poll();
if (current.equals(end)) return depth;
Iterator<String> it = dict.iterator();
while(it.hasNext()) {
String tmp = it.next();
if (adjacent(tmp, current)) {
q1.offer(tmp);
q2.offer(depth + 1);
it.remove();
}
}
}
return 0;
}
public boolean adjacent(String a, String b) {
int result = 0;
for (int i = 0; i < a.length(); i++) {
if (a.charAt(i) != b.charAt(i)) result++;
}
return result == 1;
}
}
It is a BFS problem.
Code:
import java.util.*;
public class Solution {
public int ladderLength(String start, String end, HashSet<String> dict) {
LinkedList<String> q1 = new LinkedList<String>(); // as a queue
LinkedList<Integer> q2 = new LinkedList<Integer>(); // as a queue
q1.offer(start);
q2.offer(1);
dict.remove(start);
while (!q1.isEmpty()) {
String current = q1.poll();
int depth = q2.poll();
if (current.equals(end)) return depth;
Iterator<String> it = dict.iterator();
while(it.hasNext()) {
String tmp = it.next();
if (adjacent(tmp, current)) {
q1.offer(tmp);
q2.offer(depth + 1);
it.remove();
}
}
}
return 0;
}
public boolean adjacent(String a, String b) {
int result = 0;
for (int i = 0; i < a.length(); i++) {
if (a.charAt(i) != b.charAt(i)) result++;
}
return result == 1;
}
}
[LeetCode] Valid Number
Thought:
There is a very clear solution using state machines.
Code:
public class Solution {
public boolean isNumber(String s) {
char[] tmp = s.toCharArray();
int[][] trans = {
{ 0 ,0 ,0 ,0 ,0 ,0 },// false
{ 0 ,2 ,3 ,0 ,1 ,4 },// 1
{ 0 ,2 ,5 ,6 ,9 ,0 },// 2
{ 0 ,5 ,0 ,0 ,0 ,0 },// 3
{ 0 ,2 ,3 ,0 ,0 ,0 },// 4
{ 0 ,5 ,0 ,6 ,9 ,0 },// 5
{ 0 ,7 ,0 ,0 ,0 ,8 },// 6
{ 0 ,7 ,0 ,0 ,9 ,0 },// 7
{ 0 ,7 ,0 ,0 ,0 ,0 },// 8
{ 0 ,0 ,0 ,0 ,9 ,0 } // 9
};
int i = 0;
int stat = 1;
while (i < tmp.length) {
int type = 0;
if (tmp[i] >= '0' && tmp[i] <= '9') type = 1;
else if (tmp[i] == '.') type = 2;
else if (tmp[i] == 'e') type = 3;
else if (tmp[i] == ' ') type = 4;
else if (tmp[i] == '+' || tmp[i] == '-') type = 5;
stat = trans[stat][type];
i++;
}
return stat == 2 || stat == 5 || stat == 7 || stat == 9;
}
}
Note:
There is a very clear solution using state machines.
Code:
public class Solution {
public boolean isNumber(String s) {
char[] tmp = s.toCharArray();
int[][] trans = {
{ 0 ,0 ,0 ,0 ,0 ,0 },// false
{ 0 ,2 ,3 ,0 ,1 ,4 },// 1
{ 0 ,2 ,5 ,6 ,9 ,0 },// 2
{ 0 ,5 ,0 ,0 ,0 ,0 },// 3
{ 0 ,2 ,3 ,0 ,0 ,0 },// 4
{ 0 ,5 ,0 ,6 ,9 ,0 },// 5
{ 0 ,7 ,0 ,0 ,0 ,8 },// 6
{ 0 ,7 ,0 ,0 ,9 ,0 },// 7
{ 0 ,7 ,0 ,0 ,0 ,0 },// 8
{ 0 ,0 ,0 ,0 ,9 ,0 } // 9
};
int i = 0;
int stat = 1;
while (i < tmp.length) {
int type = 0;
if (tmp[i] >= '0' && tmp[i] <= '9') type = 1;
else if (tmp[i] == '.') type = 2;
else if (tmp[i] == 'e') type = 3;
else if (tmp[i] == ' ') type = 4;
else if (tmp[i] == '+' || tmp[i] == '-') type = 5;
stat = trans[stat][type];
i++;
}
return stat == 2 || stat == 5 || stat == 7 || stat == 9;
}
}
Note:
| type | 0 | 1 | 2 | 3 | 4 | 5 | |
| stat | others | digits | point | e | space | sign | |
| 0 | FALSE | ||||||
| 1 | only space | ||||||
| 2 | digits | ||||||
| 3 | only point | ||||||
| 4 | sign | ||||||
| 5 | digits. | ||||||
| 6 | e | ||||||
| 7 | e digits | ||||||
| 8 | e sign | ||||||
| 9 | valid space | ||||||
Sunday, March 17, 2013
[LeetCode] Populating Next Right Pointers in Each Node
Thought:
Recursion.
Code:
public class Solution {
public void connect(TreeLinkNode root) {
if (root == null) return;
if (root.left != null) root.left.next = root.right;
if (root.right != null) root.right.next = root.next != null ? root.next.left : null;
connect(root.left);
connect(root.right);
}
}
Thought: using a Level Order Traversal will be more clear and common.
Code:
public void connect(TreeLinkNode root) {
if (root == null) return;
Queue<TreeLinkNode> q1 = new LinkedList<TreeLinkNode>();
Queue<Integer> q2 = new LinkedList<Integer>();
q1.offer(root);
q2.offer(1);
while (!q1.isEmpty()) {
TreeLinkNode current = q1.poll();
int level = q2.poll();
if (q2.peek() != null && q2.peek() == level) {
current.next = q1.peek();
}
//do something with current
if (current.left != null) {
q1.offer(current.left);
q2.offer(level + 1);
}
if (current.right != null) {
q1.offer(current.right);
q2.offer(level + 1);
}
}
}
Subscribe to:
Posts (Atom)