2020-04-16 (DP, Array)
昨晚宿醉,今天有点累。
刷点 easy 放松一下。
392. Is Subsequence
两个指针,一个在s上一个在t上。
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isSubsequence = function (s, t) {
if (!s.length) return true;
let indexS = 0;
let indexT = 0;
while (indexT < t.length) {
if (s[indexS] === t[indexT]) {
indexS += 1;
if (indexS === s.length) {
return true;
}
}
indexT += 1;
}
return false;
};
509. Fibonacci Number
爬楼梯原题,没什么好说的。前几天有个百度的哥们来面试没写出来,被同事一阵吐槽。引以为戒。
/**
* @param {number} N
* @return {number}
*/
var fib = function (N) {
if (N <= 1) return N;
let pre = 0;
let lat = 1;
let fibo = 0;
while (N >= 2) {
fibo = pre + lat;
pre = lat;
lat = fibo;
N -= 1;
}
return fibo;
};
1137. N-th Tribonacci Number
与上一题类似,提交之后整理 github 时才发现我之前做过了。去年的解法做了 memoization。哎,现在写代码,只追求完成,需要警醒。
/**
* @param {number} n
* @return {number}
*/
var tribonacci1 = function (n) {
const memoization = {};
for (let i = 0; i <= n; i++) {
if (i === 0 || i === 1) {
memoization[i] = i;
continue;
}
if (i === 2) {
memoization[i] = 1;
continue;
}
memoization[i] = memoization[i - 3] + memoization[i - 2] + memoization[i - 1];
}
return memoization[n.toString()];
};
/**
* @param {number} n
* @return {number}
*/
var tribonacci2 = function (n) {
if (n <= 1) return n;
if (n === 2) return 1;
let pre = 0;
let mid = 1;
let lat = 1;
let tribo = 0;
while (n >= 3) {
tribo = pre + mid + lat;
pre = mid;
mid = lat;
lat = tribo;
n -= 1;
}
return tribo;
};
303. Range Sum Query - Immutable
刷过了二维数组的 dp 之后面对现在这种一维的,基本上一遍过。
corner case 还是要注意。
/**
* @param {number[]} nums
*/
var NumArray = function (nums) {
const dp = nums.slice();
for (let i = 1; i < nums.length; i++) {
dp[i] = nums[i] + dp[i - 1];
}
this.dp = dp;
};
/**
* @param {number} i
* @param {number} j
* @return {number}
*/
NumArray.prototype.sumRange = function (i, j) {
const { dp } = this;
return i === 0 ? dp[j] : dp[j] - dp[i - 1];
};
/**
* Your NumArray object will be instantiated and called as such:
* var obj = new NumArray(nums)
* var param_1 = obj.sumRange(i,j)
*/