剑指 Offer 09. 用两个栈实现队列

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
var CQueue = function () {
this.inStatck = [];
this.outStack = [];
};

/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function (value) {
this.inStatck.push(value);
};

/**
* @return {number}
*/
CQueue.prototype.deleteHead = function () {
if (!this.outStack.length) {
if (!this.inStatck.length) {
return -1;
}
this.reserveStack();
}

return this.outStack.pop();
};

CQueue.prototype.reserveStack = function () {
while (this.inStatck.length) {
this.outStack.push(this.inStatck.pop());
}
};
/**
* Your CQueue object will be instantiated and called as such:
* var obj = new CQueue()
* obj.appendTail(value)
* var param_2 = obj.deleteHead()
*/

剑指 Offer 04. 二维数组中的查找

image-20230715203004735

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var findNumberIn2DArray = function (matrix, target) {
if (!matrix.length) return false;
let i = matrix.length - 1;
let j = 0;
while (i >= 0 && j < matrix[0].length) {
if (matrix[i][j] < target) {
j++;
} else if (matrix[i][j] > target) {
i--;
} else {
return true;
}
}
return false;
};

剑指 Offer 32 - II. 从上到下打印二叉树 II

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var levelOrder = function (root) {
let queue = [];
let res = [];
if (!root) {
return res;
}
queue.push(root);
if (queue.length !== 0) {
let len = queue.length;
res.push([]);
for (let i = 0; i < len; i++) {
let node = queue.shift();
res[res.length - 1].push(node.val);
if (node.left) {
queue.push(node.left);
}
if (node.right) {
queue.push(node.right);
}
}
}
return res;
};

剑指 Offer 45. 把数组排成最小的数

js
1
2
3
4
5
6
7
8
9
10
/**
* @param {number[]} nums
* @return {string}
*/
var minNumber = function (nums) {
nums = nums.sort((a, b) => {
return "" + a + b - ("" + b + a);
});
return nums.join("");
};

剑指 Offer 10- II. 青蛙跳台阶问题

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @param {number} n
* @return {number}
*/
var numWays = function (n) {
if (n == 0 || n == 1) {
return 1;
}

let f1 = 1;
let f2 = 1;
let f3 = 0;
for (let i = 2; i <= n; i++) {
f3 = (f1 + f2) % 1000000007;
f1 = f2;
f2 = f3;
if (i === n) {
return f3;
}
}
};

剑指 Offer 63. 股票的最大利润

  • 暴力法
js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
let max = 0;
for (let i = 0; i < prices.length; i++) {
for (let j = i + 1; j < prices.length; j++) {
let profit = prices[j] - prices[i];
if (profit > max) {
max = profit;
}
}
}
return max;
};
  • 在价格最低点买入,之后比较之前获得的最大利润加上今天的是否比之前的大,当前价格是否比最小价格小。也就是最低点买入后,只需考虑之后的每一天到底要不要买出。
js
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
let max = 0;
let minPrice = Number.MAX_VALUE;
for (let price of prices) {
max = Math.max(max, price - minPrice);
minPrice = Math.min(price, minPrice);
}
return max;
};

剑指 Offer 42. 连续子数组的最大和

image-20230726214338657

比较(左侧最大和)当前值与(左侧最大和)的大小,哪个大取哪个值。用 max 记录之前最大和,1、1 和-2+1 比较,取 1,max 记为 1;2、1±3 和-3 比较,取 1±3,max 记为-2,;3、4 与-2+4 比较,取 4,max<4 ,max 记为 4…

js
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function (nums) {
let leftMax = nums[0];
let max = nums[0];
for (let i = 1; i < nums.length; i++) {
leftMax = Math.max(nums[i], leftMax + nums[i]);
max = leftMax > max ? leftMax : max;
}
return max;
};