leetcode 4月 每日一题(持续更新

202 阅读2分钟

不会算法的前端不是好前端 用js刷leetcode,坚持每日一题 @TOC

4月

4.1日 String to Integer (atoi)

题目:8. String to Integer (atoi) 字符串转换整数

解法1: 用现成的parseInt()呀,来对比一下需求

题目要求为: parseInt()
无视开头空格 符合
含有符号 符合
无视整数部分后的字符 符合
范围在32位内,超出返回 INT_MAX (2^31− 1) 或 INT_MIN (−2^31) 不符合(需要手动判断一下)
不能有效转换时返回 0 不能转化时返回NaN
/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function(str) {
    const number = parseInt(str, 10);//10进制
    if(isNaN(number)) return 0;//不能有效的转换
    return number < Math.pow(-2, 31) ? Math.pow(-2, 31):(number > Math.pow(2, 31) - 1?Math.pow(2, 31) - 1:number);
}

在这里插入图片描述

再来看一下官方的方法:确定有限状态机

4.2日 Container With Most Water

题目:11. Container With Most Water 盛最多水的容器

在这里插入图片描述
贪心,左右指针

var maxArea = function(height) {
    var l = 0, r = height.length-1; // 左右指针
    var temp = 0, ans = 0;
    while(l < r){
        temp = (r-l)*(Math.min(height[l],height[r])); //计算此时容积
        ans<temp && (ans = temp); //记录最优解
        height[l] < height[r] ? l++ : r--; //哪边短哪边往里移动
    }
    return ans;
};

在这里插入图片描述

4.3日 Container With Most Water

题目:22. Generate Parentheses 括号生成

一开始的写法比较蠢... 循环加(),set去重 () --> (()) --> (()()), ((())), (())() () --> ()() --> (())(), ()()(), ()(())

/**
 * @param {number} n
 * @return {string[]}
 */
var fun1 = function(s){
    let ans = new Set();
    for(let temp of s){
        for(var j=0;j<temp.length;j++){
           ans.add(temp.slice(0,j-1)+"()"+temp.slice(j-1));
        }
    }
    return ans;
}
var generateParenthesis = function(n) {
    if(n==0) return [];
    let s = new Set();s.add("()");
    while(--n){s = fun1(s);}
    return [...s];
};

回溯

var generateParenthesis = function(n) {
    let res = [];
    let dfs = (s, left, right)=>{
        if(left ==n &&right==n) return res.push(s);
        if(left < n) dfs(s+'(', left+1, right);
        if(right < left) dfs(s+')', left, right+1);
    }
    dfs('', 0, 0);
    return res;
};

在这里插入图片描述

4.23 Rotate Matrix LCCI

01.07. Rotate Matrix LCCI 旋转矩阵

会占用额外空间的方法

在这里插入图片描述
代码:

var rotate = function(matrix) {
    var _matrix = JSON.parse(JSON.stringify(matrix)), len = matrix.length;
    for(var i=0;i<len;i++){
         for(var j=0;j<len;j++){
             matrix[j][len-1-i]=_matrix[i][j];
         }
    }
};

在这里插入图片描述

4.24 Coin LCCI

硬币,给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 动态规划,

/**
 * @param {number} n
 * @return {number}
 */
let waysToChange = (n)=> {
    let dp = new Array(n+1).fill(1)
    let coins = [1,5,10,25]
    for(let i=1; i<4; i++){
        for(let j=1; j<=n; j++){
            if(j-coins[i]>=0){
                dp[j] = (dp[j]+dp[j-coins[i]]) % (1e9+7)
            } 
        }
    }
    return dp[n];
};

在这里插入图片描述

4.25 Permutations

46 Permutations 全排列 回溯法 深度优先搜索

在这里插入图片描述

var permute = function(nums) {
  if(nums==0) return [];
    var len=nums.length,used=[],path=[],ans=[];
    var dfs = function(d){
        if(d==len){ans.push([...path]);//拷贝}
        for(var i=0;i<len;i++){
            if(!used[nums[i]]){//该数字还没被加入path
                path.push(nums[i]);
                used[nums[i]] = true;
                dfs(d+1);
                path.pop();
                used[nums[i]] = false;
            }
        }
    }
    dfs(0);
    return ans;
};

在这里插入图片描述