![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
词不达意zn
这个作者很懒,什么都没留下…
展开
-
数组中出现次数大于n的元素
原创 2021-10-08 10:38:16 · 133 阅读 · 0 评论 -
867.转置矩阵
翻译 2021-09-26 17:21:59 · 71 阅读 · 0 评论 -
NC127 最长公共子串
NC127 最长公共子串滑动窗口法判断两个字符串长短,str1.length>str2.length则交换;循环遍历短字符串str1来截取子串,定义一个maxLen保存最长子串的长度;如果str1的字串存在str2中,则把字串赋值给res保存,并且flag++确保下次遍历截取str1子串的左区间保持原样,右区间向右滑动一个字符;如果str1的字串不存在str2中,flag不变,i++,窗口整体向右滑动一个字符/** * longest common substring * @pa原创 2021-09-10 12:33:29 · 75 阅读 · 0 评论 -
43. 字符串相乘
43. 字符串相乘思路普通竖式计算以num1 = 123 , num2 = 456为例:我们遍历 num2 每一位与 num1 进行相乘,将每一步的结果进行累加,在这个过程如果相乘或者相加的结果大于等于10 ,我们都要去满10进位,如下图所示:这样模拟普通竖式计算的方法较为复杂,我们可以考虑优化版的竖式计算。以下题解参考力扣上的一位大神优化竖式其实在相乘或者相加计算过程的每一位,我们可以考虑先不去满10进位,等到计算完所有的相乘结果以后,最终将其加到一块,再去满10进位 ,最后的结果和普通原创 2021-09-09 16:32:32 · 113 阅读 · 0 评论 -
415. 字符串相加
415. 字符串相加算法流程:设定 i,j 两指针分别指向 num1,num2 尾部,模拟人工加法;计算进位: 计算 carry = tmp / 10,代表当前位相加是否产生进位;添加当前位: 计算 tmp = n1 + n2 + carry,并将当前位 tmp % 10 添加至 res 头部;索引溢出处理: 当指针 i或j 走过数字首部后,给 n1,n2 赋值为 0,相当于给 num1,num2 中长度较短的数字前面填 0,以便后续计算。当遍历完 num1,num2 后跳出循环,并根据 ca原创 2021-09-09 15:24:13 · 69 阅读 · 0 评论 -
NC52 括号序列
NC52 括号序列方法一:借助辅助栈——左括号入栈,右括号出栈核心思想:每次遇到’(’,’{’,’[‘这三种字符的时候,将字符入栈stk;而每次遇到’)’,’}’,’]‘这三种字符的时候则让对应的匹配字符出栈。具体规则如下:1)引入辅助栈stk,遍历字符串,每次遇到’(’,’{’,’[‘字符的时候将字符入栈stk2)当遇到’)’,’}’,’]'字符的时候,则检查栈是否空,且顶元素是否为匹配元素(如{和}匹配等),如果栈空或者栈顶元素不为匹配元素则括号序列不合法3)当栈非空,且栈顶元素为匹配元素原创 2021-09-09 11:29:53 · 472 阅读 · 0 评论 -
NC3 链表中环的入口结点
NC3 链表中环的入口结点方法1 使用Set数据结构通过使用set或者map来存储已经遍历过的结点,当第一次出现重复的结点时,即为入口结点。/*function ListNode(x){ this.val = x; this.next = null;}*/function EntryNodeOfLoop(head){ let newSet = new Set(); while(head !== null){ if(newSet.has(head)原创 2021-09-09 10:56:34 · 415 阅读 · 0 评论 -
剑指 Offer II 002. 二进制加法
剑指 Offer II 002. 二进制加法算法流程:从右边对应位依次相加,判断能否被2整除取余数放入新字符串把除数放入变量carry,以供下次循环时对应位相加时使用跳出循环后,判断carry是否有值,如果有就加入新字符串...原创 2021-09-03 15:08:49 · 41 阅读 · 0 评论 -
1624. 两个相同字符之间的最长子字符串
1624. 两个相同字符之间的最长子字符串1.暴力解法var maxLengthBetweenEqualCharacters = function(s) { let max = -1,len = s.length; for(let i = 0;i<len;i++){ for(let j = i+1;j<len;j++){ if(s[j] == s[i]){ max原创 2021-09-03 09:53:05 · 110 阅读 · 0 评论 -
NC22 合并两个有序的数组
NC22 合并两个有序的数组直接push后排序/** * * @param A int整型一维数组 * @param B int整型一维数组 * @return void */function merge( A, m, B, n ) { // write code here for(let item of B){ A.push(item); } A.sort((a,b)=>a-b)}module.exports = {原创 2021-09-02 21:44:10 · 78 阅读 · 0 评论 -
NC41 最长无重复子数组
NC41 最长无重复子数组/** * * @param arr int整型一维数组 the array * @return int整型 */function maxLength( arr ) { // write code here let len = arr.length,maxLen = 0,a = [],index; for(var i =0;i<len;i++){ index = a.indexOf(arr[i]); //查找数组中是否原创 2021-09-02 20:09:59 · 51 阅读 · 0 评论 -
连续子数组的最大和
连续子数组的最大和暴力解法:时间复杂度:O(n^2)/** * max sum of the subarray * @param arr int整型一维数组 the array * @return int整型 */function maxsumofSubarray( arr ) { let max = Number.MIN_VALUE; for(var i = 0;i<arr.length;i++){ let sum = 0; for(v原创 2021-09-02 15:41:49 · 50 阅读 · 0 评论 -
k个一组翻转链表
k个一组翻转链表下图是一位力扣大佬的图解法,为了方便理解记忆步骤分解:链表分区为已翻转部分+待翻转部分+未翻转部分每次翻转前,要确定翻转链表的范围,这个必须通过 k 此循环来确定需记录翻转链表前驱和后继,方便翻转完成后把已翻转部分和未翻转部分连接起来初始需要两个变量 pre 和 end,pre 代表待翻转链表的前驱,end 代表待翻转链表的末尾经过k此循环,end 到达末尾,记录待翻转链表的后继 next = end.next翻转链表,然后将三部分链表连接起来,然后重置 pre 和 end原创 2021-09-02 11:20:19 · 47 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表1.递归function ListNode(x){ this.val = x; this.next = null;}/** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */var mergeTwoLists = function(l1,l2){ var newNode = new ListNode(null); if(l1 == nul原创 2021-09-01 11:03:29 · 61 阅读 · 0 评论 -
NC88 寻找第K大
NC119 最小的K个数基于快速排序的选择方法,只要某次划分的 基准pivot 为倒数第 k个下标的时候,我们就已经找到了答案。 我们只关心这一点,至于a[l⋯q−1] 和 a[q+1⋯r] 是否是有序的,我们不关心。function findKth( a , n , K ) { return quickfind(a,0,n-1,K) } function quickfind(a, left, right, k) { let i = left, j = right, p原创 2021-09-01 09:33:26 · 266 阅读 · 0 评论 -
102. 二叉树的层序遍历;深度优先遍历和广度优先遍历
深度优先遍历(DFS) 与广度优先遍历(BFS)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,深度优先就是自上而下的遍历搜索 广度优先则是逐层遍历对于算法来说 无非就是时间换空间 空间换时间深度优先不需要记住所有的节点, 所以占用空间小, 而广度优先需要先记录所有的节点占用空间大深度优先有回溯的操作(没有路走了需要回头)所以相对而言时间会长一点深度优先采用的是堆栈的形式, 即先进后出广度优先则采用的是队列的形式, 即先进先出深度优先遍历主要思路是从图原创 2021-08-31 16:02:42 · 1479 阅读 · 0 评论 -
NC119 最小的K个数
1.排序直观的做法是,将整个数组排好序后,取数组前k个或最后k个数,但这种方法时间复杂度较高(O(n*log(n))),在数据量很大的情况不适用。function GetLeastNumbers_Solution(input, k){ input.sort((a,b)=>{ return a-b; }) return input.slice(0,k)}module.exports = { GetLeastNumbers_Solution : G原创 2021-08-30 17:09:29 · 58 阅读 · 0 评论 -
392. 判断子序列
392. 判断子序列原创 2021-08-30 16:22:47 · 38 阅读 · 0 评论 -
NC45 实现二叉树先序,中序和后序遍历
比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点,前序顺序是ABC(根节点排最先,然后同级先左后右);中序顺序是BAC(先左后根最后右);后序顺序是BCA(先左后右最后根)。先(根)序遍历(根左右):A B D H E I C F J K G A B C以ABC作为根节点继续 遍历中(根)序遍历(左根右) : D H B E I A J F K C G后(根)序遍历(左右根) : H D I E B J K F G C ANC.原创 2021-08-30 10:34:38 · 80 阅读 · 0 评论 -
NC93 设计LRU缓存结构
NC93 设计LRU缓存结构题目:代码如下:/** * lru design * @param operators int整型二维数组 the ops * @param k int整型 the k * @return int整型一维数组 */function LRU( operators , k ) { let hashMap = new Map(); let list = []; operators.forEach((item)=>{ if(原创 2021-08-29 16:39:21 · 48 阅读 · 0 评论 -
409.最长回文串
409.最长回文串var longestPalindrome = function(s) { var set = new Set(); var count = 0; for(var i=0; i<s.length; i++){ if(set.has(s[i])){ count +=2; set.delete(s[i]) }else{ set.add(s[i])原创 2021-08-25 16:40:45 · 40 阅读 · 0 评论 -
回文数判断
判断一个数是不是回文数 var isPalindrome = function(x) { if ( x < 0 ) return false let str = '' + x return Array.from(str).reverse().join('') === str }; console.log(isPalindrome(1211));原创 2021-08-25 16:25:53 · 56 阅读 · 0 评论 -
滑动窗口的最大值
/** * @param {number[]} nums * @param {number} k * @return {number[]} */var maxSlidingWindow = function(nums, k) { if(k<=1) return nums; const res = []; for(var i =0;i<nums.length-k+1;i++){ res.push(Math.max(...nums.slice(i,.原创 2021-08-22 20:41:04 · 37 阅读 · 0 评论 -
使用ES5和ES6求函数参数的和
//ES6 function sum(...nums) { let result = 0; nums.forEach(function (item) { result += item; }) return result; } //ES6 function sum() { let result = 0; Array.prototype.forEach.call(arguments,function (item) { ..原创 2021-08-22 15:58:06 · 161 阅读 · 0 评论 -
实现数组元素求和
reduce先去扁平化再求和递归实现let arr=[1,2,3,4,5,6,7,8,9,10]; let sum = arr.reduce((pre,cur)=>{ return pre+cur; },0) console.log(sum); var arr=[1,2,3,[[4,5],6],7,8,9]; let newArr = arr.toString().split(',').map((item)=>{return Number(item)}.原创 2021-08-21 21:45:53 · 773 阅读 · 0 评论 -
实现数组的乱序输出
//Math.round返回一个最接近的值,如果是0.5,上下距离一样,向正无穷方向取值,其实就是取较大的值。主要的实现思路就是:取出数组的第一个元素,随机产生一个索引值,将该第一个元素和这个索引对应的元素进行交换。第二次取出数据数组第二个元素,随机产生一个除了索引为1的之外的索引值,并将第二个元素与该索引值对应的元素进行交换按照上面的规律执行,直到遍历完成 var arr = [1,2,3,4,5,6,7,8,9,10]; for (var i = 0;i<arr.length;原创 2021-08-21 21:28:22 · 697 阅读 · 0 评论 -
二分法查找
1.二分法查找二分法查找算法: 采用二分法查找时,数据需是排好序的。 主要思想是:(设查找的数组区间为array[s, e]) (1)确定该区间的中间位置m (2)将查找的值T与array[m]比较,若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。 区域确定如下: 这里设array从小到大排列, array[m]>T由数组的有序性可知array[m,……,e]>T; 故新的区间为array[s,……,m-1], 类似上面查找区间arr原创 2021-08-21 15:03:34 · 109 阅读 · 0 评论 -
扁平化数组以及数组去重
扁平化数组以及数组去重并升序处理 function arrFlat(arr) { let newArr = arr.flat(Infinity); //去扁平化 return Array.from(new Set(newArr)).sort((a,b)=>a-b); }function arrFlat(arr) { let newArr = arr.toString().split(",").map(item => { return Number(ite原创 2021-07-28 09:49:23 · 66 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 100原创 2021-07-28 09:47:56 · 102 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 58 - II. 左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = "abcdefg", k = 2输出: "cdefgab"示例 2:输入: s = "lrloseumgh", k = 6输出: "umghlrlose"限制:1 <= k < s.length <原创 2021-07-27 16:39:44 · 67 阅读 · 0 评论 -
27. 移除元素
27. 移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,1,2,2,3,0,4,2], val = 2,函数应该返回新的长度 5原创 2021-07-27 12:02:42 · 115 阅读 · 0 评论 -
题目:剑指Offer 05.替换空格
题目:剑指Offer 05.替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1: 输入:s = “We are happy.”输出:“We%20are%20happy.”思路1:借助字符串、数组方法/** * @param {string} s * @return {string} */var replaceSpace = function(s) { let res = s.split(" "); return res.join("%20");}原创 2021-07-25 16:12:15 · 54 阅读 · 0 评论 -
541. 反转字符串 II
541. 反转字符串 II给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。示例:输入: s = "abcdefg", k = 2输出: "bacdfeg"提示:该字符串只包含小写英文字母。给定字符串的长度和 k 在 [1, 10000] 范围内。思路:暴力解法在遍历字符串的过程中,只要让i +原创 2021-07-25 14:45:36 · 42 阅读 · 0 评论 -
344. 反转字符串
344. 反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]示例 2:输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a"原创 2021-07-23 21:40:06 · 103 阅读 · 0 评论 -
哈希表总结
哈希表总结转载 2021-07-23 21:09:58 · 47 阅读 · 0 评论 -
15. 三数之和
15. 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 <= nums.length <= 30原创 2021-07-23 20:33:47 · 25 阅读 · 0 评论 -
454. 四数相加 II
454. 四数相加 II给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。例如:输入:A = [ 1, 2]B = [-2,-1]C = [-1, 2]D = [ 0, 2]输出:2原创 2021-07-23 16:24:55 · 35 阅读 · 0 评论 -
1. 两数之和
1. 两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], t原创 2021-07-22 11:15:31 · 51 阅读 · 0 评论 -
202.快乐数
编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 true ;不是,则返回 false 。示例 1:输入:19输出:true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1示例 2:输入:n =原创 2021-07-22 10:11:24 · 46 阅读 · 0 评论 -
350. 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]方法:hashMap由于同一个数字在两个数组中都可能出现多次,因此需要用哈希表存储每个数字出现的次数。对于一个数字,其在交集中出现的次数等于该数字在两个数组中出现次数的最小值。首先遍历第一个数组,并在哈希表中记录第一个数组中的每个数字以及对应出现原创 2021-07-20 10:38:51 · 43 阅读 · 0 评论