(算法)LeetCode刷题
LeetCode 56 合并区别
Given
[1,3],[2,6],[8,10],[15,18],
return[1,6],[8,10],[15,18].关键就是
a[1]>=b[0]也就是array[i-1][1]>=array[i][0]
const merge = array => {
array.sort((a, b) => a[0] - b[0])
for (let i = 1; i < array.length; i++) {
let minLeft = Math.min(array[i - 1][0], array[i][0]);
let maxRight = Math.max(array[i - 1][1], array[i][1]);
if (array[i - 1][1] >= array[i][0]) {
array[i - 1] = [minLeft, maxRight]
array.splice(i, 1)
i--
}
}
return array
}
console.log(merge([[1, 3], [8, 10], [2, 6], [15, 18]]))
//[ [ 1, 6 ], [ 8, 10 ], [ 15, 18 ] ]
Leetcode 459 判断重复的子串
str.length % s.length
const repeated = s => {
for (let i = 1; i < s.length; i++) {
//从第一个字符串开始
let str = s.slice(0, i)
//他的上限就是两个数相等
// if (str.length % s.length) {
if (!(str.length == s.length)) {
let emptyStr = ''
let repeatNum = s.length / str.length
//算重复的字符,然后判断相等
for (let j = 0; j < repeatNum; j++) {
emptyStr += str
}
if (emptyStr == s) {
return true
}
}
}
return false
}
console.log(repeated('abab'))
走楼梯
//走楼梯 小孩最多走1,2,3个,问总楼梯数n,有多少种走法
Dp f(x,y)=f(x,y-1)+f(x-1,y)
const recursion = n => {
if (n < 0) return 0
if (n == 0 || n == 1) return 1
if (n == 2) return 2
return recursion(n-1)+recursion(n-2)+recursion(n-3)
}
console.log(recursion(3)) //4
机器人走格子
//f(x,y)=f(x-1,y)+f(x,y-1)
const solve = (x, y) => {
if (x == 1 || y == 1) return 1
return solve(x - 1, y) + solve(x, y - 1)
}
console.log(solve(2, 3))
606
题目
[1,2,3,4]
1
2 3
4
"1(2(4))(3()())" 两个括号在一起就可以省略
"1(2(4))(3)"
[1,2,3,null,4]
1
2 3
4
"1(2()(4))(3)"
let tree={
val:1,
left:{
val:2,
left:{
val:3
},
right:{
val:4
}
},
right:{
val:5,
right:{
val:6
}
}
}
const tree2str = t => {
if (t == null) {
return ''
}
if (t.left == null && t.right == null) {
return t.val + ''
}
if (t.left == null) {
return t.val + '()' + '(' + tree2str(t.right) + ')'
}
if (t.right == null) {
return t.val + '(' + tree2str(t.left) + ')'
}
return t.val + '(' + tree2str(t.left) + ')' + '(' + tree2str(t.right) + ')'
}
console.log(tree2str(tree))
合法括号
n 组合
1 ()
2 ()() (())
3 ()()() (()()) ((()))
const printPar = (l, r,s='', result=[]) => {
if (l == 0 && r == 0) {
return result.push(s)
}
if (l > 0) {
printPar(l-1,r,s+'(',result)
}
if (r > 0 && l < r) {
printPar(l,r-1,s+')',result)
}
return result
}
console.log(printPar(3, 3))
3
// 'abcab' => 'abc'
// 'abcabc' => 'abc'
// 'abcdababab' =>'abcd'
//计数排序
const solution = (s) => {
if (s == null || s.length == 0) {
return 0
}
let hash = Array.from({length:256},v=>0);
let begin = 0,
end = 0;
let repeat = 0,
res = 0;
while (end < s.length) {
//a++>0 先执行>再执行后++
//第一个判断是把重复的放到数组中,repeat是计算重复了多少次
if (hash[s.charCodeAt(end++)]++ > 0) {
//s.charCodeAt(end) 查找这个数的索引 放在数组中+1
//end++ repeat++是计算重复的次数
repeat++
}
while (repeat > 0) {
//这个是把重复的次数减去
if (hash[s.charCodeAt(begin++)]-- > 1) {
repeat--
}
}
//总次数减去不重复的 5-2=3
res = Math.max(res, end - begin)
}
console.log(hash)
return res
}
console.log(solution('abcab'))
669
输入:
1
/ \
0 2
L = 1
R = 2
输出:
1
\
2
输入:
3
/ \
0 4
\
2
/
1
L = 1
R = 3
输出:
3
/
2
/
1
二叉搜索树,进行范围限制
const trimBST = (root, l, r) => {
if (root == null) {
return null
}
if (root.val < l) {
return trimBST(root.right, l, r)
}
if (root.val > r) {
return trimBST(root.left, l, r)
}
root.left = trimBST(root.left, l, r)
root.right = trimBST(root.right, l, r)
return root
}
11盛最多水的容器

//双指针
const maxArea = height => {
let left = 0,
right = height.length - 1,
maxVal = 0;
while (left < right) {
let contain = (right - left) * Math.min(height[left], height[right])
maxVal = Math.max(contain, maxVal)
if (height[left] >= height[right]) {
right--
} else {
left++
}
}
return maxVal
}
console.log(maxArea([1, 2, 3, 4, 5, 5, 1, 2, 3, 4]))
20 合法括号

() //true
()[]{} //true
{[]} //true
逻辑
使用栈遍历输入字符串
如果当前字符串为左括号时,则将压入栈中
如果遇到右括号时:
* 如果栈不为空且为对应的左半括号,则取出栈顶元素,继续循环
* 若此时栈为空,则直接返回false
* 若不为对应的左半括号,直接返回false
const isValid = s => {
let valid = true;
const stack = [];
const mapper = {
'{': '}',
'[': ']',
'(': ')'
};
for (let i in s) {
if (['(', '[', '{'].indexOf(s[i]) > -1) {
stack.push(s[i])
} else {
//stack.pop出栈后,比较是否有反括号
if (s[i] !== mapper[stack.pop()]) {
return false
}
}
}
if(stack.length>0) return false
return valid
}
console.log(isValid('()'))
26 从排序数组中删除重复项
思路
使用快慢指针来记录遍历的坐标
- 开始时这两个指针都指向第一个数字
- 如果两个指针指的数字相同,则块指针向前走一步
- 如果不同,则两个指针都向前
- 当快指针走完整个数组后,慢指针当前的坐标+1就是数组中不同数字的个数
const removeDuplicates = nums => {
let slow = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== nums[slow]) {
slow++
nums[slow] = nums[i]
}
}
return slow+1
}
console.log(removeDuplicates([1, 2,3,4,4,4,4,4,5,6,7,8]))
88 合并两个有序数组
const merge = (num1, num2) => {
let ret = [];
while (num1.length || num2.length) {
if (num1.length == 0) {
ret.push(num2.shift())
continue
}
if (num2.length == 0) {
ret.push(num1.shift())
continue
}
if (num1[0] >= num2[0]) {
ret.push(num2.shift())
} else {
ret.push(num1.shift())
}
}
return ret
}
简洁版
const merge = (nums1, m, nums2, n) => {
let i1 = m - 1,
i2 = n - 1,
k = m + n - 1;
while (i1 >= 0 && i2 >= 0) {
if (nums1[i1] < nums2[i2]) {
nums1[k--] = nums2[i2--]
} else {
nums1[k--] = nums1[i1--]
}
}
while (i2 >= 0) {
nums1[k--] = nums[i2--]
}
return nums1
}
104二叉树的最大深度
const maxDepth=root=>{
if(!root) return 0
if(!root.left&&!root.right) return 1
return 1+Math.max(maxDepth(root.left),maxDepth(root.right))
}
(算法)LeetCode刷题的更多相关文章
- C#LeetCode刷题-贪心算法
贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配 17.8% 困难 45 跳跃游戏 II 25.5% 困难 55 跳跃游戏 30.6% 中等 122 买卖股票的最佳时机 II C ...
- C#LeetCode刷题-分治算法
分治算法篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...
- 看完互联网大佬的「LeetCode 刷题手册」, 手撕了 400 道 Leetcode 算法题
大家好,我是 程序员小熊 ,来自 大厂 的程序猿.相信绝大部分程序猿都有一个进大厂的梦想,但相较于以前,目前大厂的面试,只要是研发相关岗位,算法题基本少不了,所以现在很多人都会去刷 Leetcode ...
- LeetCode刷题专栏第一篇--思维导图&时间安排
昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...
- leetcode 刷题进展
最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多 前200的吃透了 足以应付非算法岗 ...
- LeetCode刷题总结-数组篇(上)
数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...
- LeetCode刷题总结-数组篇(中)
本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...
- LeetCode刷题总结-数组篇(下)
本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...
- LeetCode刷题总结-链表
LeetCode刷题总结-链表 一.链表 链表分为单向链表.单向循环链表和双向链表,一下以单向链表为例实现单向链表的节点实现和单链表的基本操作. 单向链表 单向链表也叫单链表,是链表中最简单的 ...
随机推荐
- 车间如何数字化?MES系统来助力
对于生产过程复杂多变的离散制造企业而言,面临重重考验:生产作业计划频繁变更,制造工艺复杂,在生产过程中的临时插单.材料短缺等现象.通过MES制造执行管理解决方案,搭建协同管理平台,加强控制力.执行力和 ...
- bit和byte的区别是什么?
bit(位/比特):计算机运算的基础单位: byte(字节):计算机中文件大小的基本计量单位. 转换关系:8 bit = 1 Byte1024 Byte = 1 KB1024 KB = 1 MB102 ...
- 模块 time,datetime,random,typing,hashlib,requests,re
目录 包 什么是包 为什么要包 1. 包的介绍 2. 绝对导入和相对导入 - 绝对导入 - 相对导入 time模块 时间戳 格式化时间 结构化时间 sleep datetime模块 random模块 ...
- CCF-CSP 201709-3 JSON查询 题解
试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript Object Notation) 是一 ...
- 学习CNN系列二:训练过程
卷积神经网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间精确的数学表达式,只要用已知的模式对卷积神经网络加以训练,网络就具有输入.输出之间映射的 ...
- OpenGL入门(一):使用GLFW创建简单的窗口
如果使用QT,那么创建一个OpenGL渲染窗口其实很容易,不过出于初学的角度,使用GLFW库来创建新窗口. 1. 下载并配置GLFW GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体 ...
- seq命令的使用
标题:seq命令的使用 作用:seq命令用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式.宽度.分割符号进行控制 语法: [1] seq [选项] ...
- 201871010102-常龙龙《面向对象程序设计(java)》第十周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- thymeleaf关于js的一些坑
乍一看,没问题,也许对应用过thymeleaf的小伙伴来说一眼就看出了问题,但是对于新手确实很难发现,thymeleaf会把[[]]中的内容作为内联取值块解析,而不是数组. 解决办法 方法一: < ...
- 微信小程序 - 事件 | 传递 | 冒泡
事件 常见的事件有: 类型 触发条件 最低版本 touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 t ...
