整理-逻辑算法

114 阅读1分钟

20瓶药中的药外形一样,其中一瓶每颗药的重量比其他的重0.01,给你一个没有砝码的天平,怎么快速找出重量不一样的那瓶?

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。

最后一步可能垮了1步,也可能跨了两步,所以:
f(n) = f(n - 1) + f(n - 2);
f(0) = 1
f(1) = 1
f(2) = 2
f(3) = f(2) + f(1) = 3
f(4) = f(3) + f(2) = 5
...
根据已知推未知:

/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n) {
  let p = 0;
  let q = 0;
  let r = 1;
  for(let i = 1; i <= n; i++){
      p = q;
      q = r;
      r = p + q;
  }
  return r;
};

回文子串

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

/**
 * @param {string} s
 * @return {number}
 */
var countSubstrings = function(s) {
  let count = 0;
  let n = s.length;
  for(let i = 0; i < 2 * n - 1; i++){
      let l = Math.floor(i / 2);
      let r = Math.floor(i / 2) + i % 2;
      while(i >= 0 && r < n && s.charAt(l) === s.charAt(r)){
          l--;
          r++;
          count++;
      }
  }
  return count;
};

l、r为中心点位置,回文串长为奇数则l=r,回文串长为偶数则r=l+1,2n-1为中心点组数。如“dfgdg”的中心点有:
0 - 0
0 - 1
1 - 1
1 - 2
2 - 2
2 - 3
3 - 3
3 - 4
4 - 4
while判断为中心点相等,可以继续向外扩展比较

吃香蕉

/**
 * @param {number[]} piles
 * @param {number} H
 * @return {number}
 */
var minEatingSpeed = function(piles, H) {
  let maxVal = Math.max(...piles);
  let low = 1;
  let high = maxVal;
  while(low < high) {
      const mid = Math.floor((high + low) / 2);
      if(getTime(piles, mid) > H){
          low = mid + 1;
      }else{
          high = mid;
      }
  }
  return low;
};

function getTime(piles, k) {
  return piles.reduce((total, cur) => {
      return total + Math.ceil(cur / k);
  }, 0);
}