在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
这道题目并不困难,将数组从大到小排序后,然后找出下标为 k - 1 的元素就可以了,这里我介绍三种基础且常见的排序算法。
冒泡排序:
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKthLargest = function(nums, k) {
var len = nums.length;
for (var i = 0; i < len - 1; i++) {
for (var j = 0; j < len - i - 1; j++) {
if (nums[j] < nums[j + 1]) {
var temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
return nums[k - 1];
};
选择排序:
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKthLargest = function(nums, k) {
var len = nums.length;
for (var i = 0; i < len; i++) {
var max = nums[i], z = i;
for (var j = i; j < len; j++) {
if (nums[j] > max) {
max = nums[j];
z = j;
}
}
if (z !== i) {
var temp = nums[i];
nums[i] = nums[z];
nums[z] = temp;
}
}
return nums[k - 1];
};
插入排序:
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKthLargest = function(nums, k) {
var len = nums.length;
for (var i = 1; i < len; i++) {
var j = i - 1, temp = nums[i];
while (j > -1 && temp > nums[j]) {
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = temp;
}
return nums[k - 1];
};
236. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例1:
示例2:
说明:
解法一(递归)
解析:
这种递归的解法,抓住二叉搜索树的特点(根节点,比其所有左子树上的所有节点大,比其所有右子节点上的节点小)。
这种方法写法简洁,但是递归毕竟是递归,非常吃内存消耗。若这棵二叉搜索树层次非常深,递归方式将会产生非常深的调用栈,对于我们这种对性能追求极致的"极客"来说,是容忍不了。那么我们看看下面比较通用的、非递归的解法。
解法二(非递归)
215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例1:
示例2:
这道题目并不困难,将数组从大到小排序后,然后找出下标为
k - 1
的元素就可以了,这里我介绍三种基础且常见的排序算法。冒泡排序:
选择排序:
插入排序:
122. 买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
示例2:
示例3:
题解(贪心算法):
解析:
贪心算法,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
可以看出,我们总是求解
maxPro > 0
的时候,因为这个是赚钱的情况。只要满足maxPro > 0
,那么证明股票这时候买入卖出就会赚,而且会又叠加效应,否则,并不会去股票交易,因为会出现亏损。