You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
------------------------------
-- Fibonacci number --
Solution #1 straight forward recursion
class Solution {
public:
int climbStairs(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (n == 0) {
return 1;
}
if (n < 0) {
return 0;
}
return climbStairs(n-1) + climbStairs(n-2);
}
};
Solution #2 DP, memoization
class Solution {
public:
int climb (int n,int ma[]) {
if (n == 0) {
return 1;
}
if (ma[n-1] == -1) {
ma[n-1] = climb(n-1,ma);
}
if (n == 1) { // eliminate n-2
return ma[n-1];
}
if (ma[n-2] == -1) {
ma[n-2] == climb(n-2,ma);
}
return ma[n-1] + ma[n-2];
}
int climbStairs(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int ma[n+2];
for (int i=0;i<n+2;i++) {
ma[i] = -1;
}
return climb(n,ma);
}
};
Solution #3 DP, bottom u (can be optimized to O(1) space by using int a[3])
class Solution {
public:
int climbStairs(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int ma[n+1];
ma[n] = 1;
ma[n-1] = 1;
for (int i=n;i>1;i--) {
ma[i-2] = ma[i] + ma[i-1];
}
return ma[0];
}
};
Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":
What if duplicates are allowed at most twice?
For example,
Given sorted array A =
[1,1,1,2,2,3],Your function should return length =
5, and A is now [1,1,2,2,3].-----------------
Similar to Remove Duplicates from Sorted Array
add a flag to track the first duplicate
class Solution {
public:
int removeDuplicates(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (n == 0) {
return 0;
}
bool flag = false; // duplicates are allowed at most twice
int start = 0;
for (int i=1;i<n;i++) {
if (A[start] == A[i]) {
if (!flag) { // found first duplicate
start++;
A[start] = A[i];
flag = true;
}
}else {
start++;
A[start] = A[i];
flag = false;
}
}
return start + 1;
}
};
Update on Sep-05-2014 This can handle arbitrary number of dups
class Solution {
public:
int removeDuplicates(int A[], int n) {
if (n == 0) return n;
int count = 1;
int indexOfLastElement = 0;
for (int i = 1; i < n; i++) {
if (A[indexOfLastElement] == A[i]) {
if (count < 2) {
indexOfLastElement++;
A[indexOfLastElement] = A[i]; // watch out for this line
count++;
}
}else {
indexOfLastElement++;
A[indexOfLastElement] = A[i];
count = 1;
}
}
return indexOfLastElement + 1;
}
};
No comments:
Post a Comment