
算法学习
每日一题
伯约同学
更新前端面试的一些常见题目,记录学习过程
展开
-
Leetcode18四数之和(双指针法)
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 <= a, b, c, d < n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] + nums[d] == target 你可以按 任意顺序 返回答案 。 答题: /** * @param {numbe原创 2022-04-11 21:48:24 · 378 阅读 · 0 评论 -
Leetcode306累加数(递归解决)
累加数 是一个字符串,组成它的数字可以形成累加序列。 一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。 给你一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。 说明:累加序列里的数,除数字 0 之外,不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。 答题: /** * @param {string} num *原创 2022-04-10 18:58:28 · 606 阅读 · 0 评论 -
Leetcode47全排列II(回溯+剪枝)
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 /** * @param {number[]} nums * @return {number[][]} */ var permuteUnique = function(nums) { let res = [] function dfs(arr,rest){ console.log(arr,rest) if(arr.length === nums.length){原创 2022-04-09 22:09:58 · 609 阅读 · 0 评论 -
剑指offer29顺时针打印矩阵
题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 答题: /** * @param {number[][]} matrix * @return {number[]} */ var spiralOrder = function(matrix) { let res = [] let tem = '' try{ while(matrix.length){ let top = matrix.shift() for(let原创 2022-04-07 20:17:33 · 415 阅读 · 0 评论 -
Leetcode2两数相加(链表应用)
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 答题 /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.n原创 2022-04-04 23:44:53 · 400 阅读 · 0 评论 -
Leetcode79单词搜索(深度遍历解法)
Leetcode79单词搜索(深度遍历解法) 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 /** * @param {character[][]} board * @param {string} word * @return {boolean} */原创 2022-03-30 23:41:08 · 319 阅读 · 0 评论 -
Leetcode5最长回文子串(中心拓展法和动态规划法)
Leetcode5最长回文子串(中心拓展法和动态规划法) 给你一个字符串s,找到s中最长的回文子串。 答题 /** \* @param {string} s \* @return {string} */ var longestPalindrome = function longestPalindrome(s){ let n = s.length; let res = ''; let dp = Array.from(new Array(n),() => new Array(n).fil原创 2022-03-28 23:01:18 · 618 阅读 · 0 评论 -
Leetcode76最小覆盖子串(滑动窗口解法)
Leetcode76最小覆盖子串(滑动窗口解法) 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保证它是唯一的答案。 答题: /** * @param {string} s * @param {string} t * @return {string} */ var minW原创 2022-03-27 22:38:09 · 533 阅读 · 0 评论 -
Leetcode344反转字符串(双指针解法)
Leetcode344反转字符串(双指针解法) 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 答题: /** \* @param {character[]} s \* @return {void} Do not return anything, modify s in-place instead. */ var reverseString = function(s)原创 2022-03-26 23:13:31 · 1004 阅读 · 0 评论 -
Leetcode283移动零(双指针解法)
Leetcode283移动零(双指针解法) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 答题: /** \* @param {number[]} nums \* @return {void} Do not return anything, modify nums in-place instead. */ var moveZeroes = function(nums) { let l原创 2022-03-25 12:51:51 · 489 阅读 · 0 评论 -
Leetcode977有序数组的平方(双指针解法)
Leetcode977有序数组的平方 题目 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 答题 /** \* @param {number[]} nums \* @return {number[]} */ var sortedSquares = function(nums) { let left = 0 let right = nums.length -1 let res = [] while(left <=原创 2022-03-23 22:04:50 · 281 阅读 · 0 评论 -
Leetcode34在排序数组中查找元素的第一个和最后一个位置(二分法求解)
Leetcode34在排序数组中查找元素的第一个和最后一个位置(二分法求解) 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 答题: /** \* @param {number[]} nums \* @param {number} target \* @return {number[]} */ var searchRange = function(nums, targe原创 2022-03-19 20:54:20 · 473 阅读 · 0 评论 -
三分钟学习一下JavaScript中map对象的用法
三分钟学习一下JavaScript中map对象的用法 上一篇文章花了几分钟时间看了看set对象的使用,今天来写一些map对象的使用。两者的属性和方法差不多,老规矩,整体过一下。 1. 构造方法 let myMap1 = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], [1, 'four'] ]) let myMap2 = new Map() 2. size属性 获取元素个数 由原创 2022-03-19 12:26:09 · 1021 阅读 · 0 评论 -
Leetcode20有效的括号(栈的经典使用示例)
Leetcode20有效的括号 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 答题 /** \* @param {string} s \* @return {boolean} */ var isValid = function(s) { let queue = [] let left = ['(','{','['] let map = { 原创 2022-03-16 23:20:41 · 183 阅读 · 0 评论 -
Leetcode剑指offer16不含有重复字符的最长子字符串
Leetcode16不含有重复字符的最长子字符串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。 答题: /** \* @param {string} s \* @return {number} */ var lengthOfLongestSubstring = function(s) { let queue = [] let maxLen = 0 for(let i=0;i<s.length;i++){ if(queue.includes原创 2022-03-15 23:36:09 · 253 阅读 · 0 评论 -
JavaScript中数组的splice方法和slice方法详解
JavaScript中数组的splice方法和slice方法详解 最近在做一些算法题,不能说不知道splice方法和slice方法怎么用,但是总是写出来有点点小问题,干脆就整理一下,再试两个小例子写一篇文章,彻底弄明白。 splice方法 splice() 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。 一般使用的格式是这样的 array.splice(start) array.splice(start, deleteCount) array.splice(start, deleteCount,原创 2022-03-14 22:43:39 · 1502 阅读 · 0 评论 -
Leetcode3无重复字符的最长子串(滑动窗口解法)
Leetcode3无重复字符的最长子串(滑动窗口解法) 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 答题: /** \* @param {string} s \* @return {number} */ var lengthOfLongestSubstring = function (s) { let arr = [], max = 0 for(let i = 0; i < s.length; i++) { let index = arr.indexO原创 2022-03-13 22:50:34 · 304 阅读 · 0 评论 -
Leetcode120三角形最小路径和
Leetcode120三角形最小路径和 给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。 答题: /** \* @param {number[][]} triangle \* @return {number} */ var minimumTotal =原创 2022-03-13 07:39:38 · 213 阅读 · 0 评论 -
Leetcode77组合(回溯求解)
Leetcode77组合(回溯求解) 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 答题 * @param {number} n * @param {number} k * @return {number[][]} */ var combine = function(n, k) { const res = []; const stack = []; function backtrack(start)原创 2022-03-11 23:39:47 · 162 阅读 · 0 评论 -
Leetcode994腐烂的橘子(广度搜索法)
Leetcode994腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 答题: /** \* @param {number[][]} grid \* @return {number} */ var orangesRotting = function(grid) { let m = grid.length let n =原创 2022-03-10 22:38:19 · 245 阅读 · 0 评论 -
Leetcode542:矩阵(广度遍历解法)
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 答题 /** * @param {number[][]} mat * @return {number[][]} */ var updateMatrix = function(mat) { let map = new Array(mat.length); // 用于输出的数组 let quque = [];原创 2022-03-09 22:07:43 · 301 阅读 · 0 评论 -
Leetcode733:图像渲染(广度遍历解法)
Leetcode733:图像渲染(广度遍历解法) 题目: 有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。 … 上一篇文章用深度遍历的方法解了一下这道题,后来觉得应该再用深度遍历的方法解决一下,避免自己只学到套路没懂得思想。 今天给一个广度遍历的解法 答题: var floodFill = function(image, sr, sc, newColor) { let lineLen=image.length, rowLine=im原创 2022-03-08 22:30:15 · 6134 阅读 · 0 评论 -
Leetcode733:图像渲染(深度遍历解法)
题目: 有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。 … 解法: var floodFill = function(image, sr, sc, newColor) { const initialColor = image[sr][sc] function flood(image,sr,sc){ if(sr<0 || sc<0 ||sr>= image.length||sc>= i原创 2022-03-07 22:26:41 · 150 阅读 · 0 评论 -
二分法的左右边界
二分法的左右边界 二分法用起来还是挺好用的,就是每次我总是纠结边界条件到底如何确定,用小于号还是小于等于号,满足条件后left是mid还是mid+1,为此专门做了两道简单题,整理了下思路。 题目一 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法 var searchInsert = function(nums, target) { let left = 0 let right原创 2022-03-02 22:19:42 · 364 阅读 · 0 评论