1.连续子数组的最大和
题目:
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
思路:假设list[i]为以第i个元素结尾的连续子数组的最大和,那么有两种可能,如果list[i-1]小于0,那么list[i] = nums[i],反之list[i]=list[i-1]+nums[i]。
所以动态规划可解。遍历数组,计算list[i],得到最大的结果,
可以 发现,只需要一个变量记录前一个元素的list[i]即可,所以不需要数组
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
let sum = nums[0];
let pre = nums[0];
const l = nums.length;
for (let i = 1; i < l; i++) {
pre = pre >= 0 ? nums[i] + pre : nums[i];
sum = Math.max(pre, sum);
}
return sum;
};
2.第一个只出现一次的字符
题目:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
思路:遍历字符串,用map记录每个字符,第一次出现值为true,第二次出现值为false,找到只有对应值为true的字符
/**
* @param {string} s
* @return {character}
*/
var firstUniqChar = function(s) {
if (!s) return " ";
const map = {};
const res = [];
for (const item of s) {
if (map[item] !== undefined) {
map[item] = false;
} else {
map[item] = true;
}
res.push(item);
}
return res.find((item) => map[item] === true) || " ";
};
3.在排序树组中查找数字
题目:统计一个数字在排序数组中出现的次数。
思路:二分法,然后想两边扩张比较
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
const l = nums.length;
let index = mid(0, l - 1);
if (index === false) return 0;
let c = 1;
let left = index - 1;
let right = index + 1;
while (left >= 0 && nums[left] === target) {
c++;
left--;
}
while (right <= l - 1 && nums[right] === target) {
c++;
right++;
}
return c;
function mid(start, end) {
if (nums[start] === target) return start;
if (nums[end] === target) return end;
const middle = ~~((start + end) / 2);
if (middle === start) return false;
if (nums[middle] > target) {
return mid(start, middle);
} else {
return mid(middle, end);
}
}
};
4.0-n-1中缺失的数字
题目:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
思路:0-n-1的数字序列,可以计算总和,,然后遍历数组,差值就是缺失的数字
/**
* @param {number[]} nums
* @return {number}
*/
var missingNumber = function(nums) {
const l = nums.length;
let sum = ((0 + l ) * (l + 1)) / 2;
return nums.reduce((a,b)=>a-b,sum);
};
5.二叉搜索树的第K大节点
题目:给定一棵二叉搜索树,请找出其中第k大的节点。
思路:二叉搜索树的后序遍历是递增的,所以可以中序遍历,然后记录数到了第几个节点
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthLargest = function(root, k) {
let res;
const search = (root) => {
if (res !== undefined) return;
if (!root) return;
search(root.right);
k--;
if (!k && res === undefined) {
res = root.val;
}
search(root.left);
};
search(root);
return res;
};