js解leetcode(56)-简单

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;
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值