LeetCode(485)最大连续1的个数
今天要练习的题目是:力扣(LeetCode)的第485题,最大连续1的个数
题目要求
给定一个二进制数组nums, 计算其中最大连续1的个数。
示例:
123输入:nums = [1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
提示:
1 <= nums.length <= 10^5
nums[i]不是0就是1.
解题思路这道题还是比较简单的,题目要求计算最大连续的1的个数,那我们每遇到1个1,就计数一次,如果遇到0,说明中断了,就重新计数,最后返回计数的值就可以了。由于重新计数会覆盖之前的计数,所以还需要额外的一个变量来储存返回值。老规矩,哪怕再简单的题,一图胜千言。
12345678910111213141516/** * @param {number[]} nums * @return {number} */var findMaxConsecutiveOnes = function(nums) { let count = 0, result = ...
LeetCode(70)爬楼梯
今天要练习的题目是:力扣(LeetCode)的第70题,爬楼梯
题目要求
假设你正在爬楼梯。需要n阶你才能到达楼顶。
每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例:
12345输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶
提示:
0 <= n <= 45
解题思路第一眼看上去,这道题小呆并没有看出什么名堂,所以我们根据示例,写一下输入和输出,看看能否找出规律:
n = 1输出1,有1种方法:1
n = 2输出2,有2种方法:1 + 1, 2
n = 3输出3,有3种方法: 1 + 1 + 1, 1 + 2, 2 + 1
n = 4输出5,有5种方法:1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 2 + 1, 2 + 1 + 1, 2 + 2
观察输出,嘿,这不是跟昨天做的斐波那契数一样嘛。那就当做个复习吧~ 先写递归:
12345678/** * @param {number} n * @return {number} */var fi ...
LeetCode(509)斐波那契数
今天要练习的题目是:力扣(LeetCode)的第509题,斐波那契数
题目要求
斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定n,请计算F(n)。
示例:
123输入:n = 2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1
提示:
0 <= n <= 30
解题思路大名鼎鼎的斐波那契数,也是面试中经常会考的一道算法题。这道题的解法有很多种,最简单的就是使用递归。毕竟怎么写题目要求都已经给出来了,所以很快就能写出来一个解法:
n < 2,返回n
F(n) = F(n - 1) + F(n - 2)
12345678/** * @param {number} n * @return {number} */var fib = function(n) { ...
LeetCode(20)有效的括号
今天要练习的题目是:力扣(LeetCode)的第20题,有效的括号
题目描述
给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例:
12345输入:s = "()"输出:true输入:s = "(]"输出:false
提示:
1 <= s.length <= 10^4
s仅由括号'()[]{}'组成
解题思路小呆做这道题的时候,5分钟内没解出来,果断看评论区和题解。这道题的主流思路是用栈来解决,由于括号都是成对出现的,所以我们可以让左侧的括号入栈,当遇到右侧的括号时,出栈匹配,能匹配到,就接着循环,直到所有括号都匹配完或者出现不匹配为止。在JavaScript中我们很容易用数组模拟一个栈。步骤如 ...
LeetCode(344)反转字符串
今天要练习的题目是:力扣(LeetCode)的第344题,反转字符串
题目要求
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。
示例:
12输入:s = ["h","e","l","l","o"]输出:["o","l","l","e","h"]
提示:
1 <= s.length <= 10^5
s[i]都是ASCII码表中的可打印字符
解题思路这道题,由于题目要求原地修改数组,小呆首先想到了前几天一直在用的双指针算法。具体思路如下:
设置left,right两个指针,一个指向数组头部,一个指向数组尾部
循环条件是left <= right
设置一个temp变量,用于left和right交换时的中转站
交换left,right,让l ...
LeetCode(21)合并两个有序链表
今天要练习的题目是:力扣(LeetCode)的第21题,合并两个有序链表
题目要求
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
12输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]
提示:
两个链表的节点数目范围是[0, 50]
-100 <= Node.val <= 100
l1和l2均按非递减顺序排列
解题思路这道题,5分钟内我没写出来。思路其实是有的,就是比较两个链表的头节点,把小的拿出来放前面,然后去比对剩下的两个链表,依次类推,但是问题是,思路有,但不知道该怎么写,这其实也是我刷题过程中最难受的。看了题解,用递归比较好实现。
比较两个链表节点的val值,将值较小的节点往前排
用值较小的节点的next节点,与另一个链表的节点比较,依次类比
两个链表的任意一方到达尾部,直接返回另一方即可
具体过程用gif图辅助理解一下:
1234567891011121314151617181920212223/** * Definition for singly- ...
LeetCode(206)反转链表
今天要练习的题目是:力扣(LeetCode)的第206题,反转链表
题目要求
给你单链表的头节点head ,请你反转链表,并返回反转后的链表。
示例:
12输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]
提示:
链表中节点的数目范围是[0, 5000]
-5000 <= Node.val <= 5000
解题思路关于链表和数组的题目,小呆还是优先考虑是否可以用双指针算法解决,毕竟最近刷的几道题都与双指针有关。由于链表之间是由next相连,所以反转链表其实就是把next的指向反转。那如何将next指向反转的呢?一共有3步:
链表的尾部节点的next一定指向null,所以我们初始化两个指针prev,curr,让其一个指向null,一个指向链表头head
进入循环,终止条件为curr !== null表示链表已经循环完毕
由于反转next会断掉当前链表,所以创建一个临时变量next,指向curr.next,防止反转next找不到路
将curr.next指向prev,然后将prev指向curr,最后将curr指向next
最后返回prev,链 ...
LeetCode(1)两数之和
今天要练习的题目是:力扣(LeetCode)的第1题,两数之和
题目要求
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例:
123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
提示:
2 <= nums.length <= 10^4
-10^9 <= nums[i] <= 10^9
-10^9 <= target <= 10^9
只会存在一个有效答案
解题思路大名鼎鼎的LeetCode第一题,通过率只有52.9%,小呆第一次做这道题也没做出来。思路其实蛮简单的,维护一个HasMap,一般情况下我们存储数据都是index -> value,因为这道题要求返回下标,所以这个HasMap维护的是value -> ind ...
LeetCode(283)移动零
今天要练习的题目是:力扣(LeetCode)的第283题,移动零
题目要求
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
请注意,必须在不复制数组的情况下原地对数组进行操作。
示例:
12输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]
提示:
1 <= nums.length <= 10^4
-2^31 <= nums[i] <= 2^31 - 1
解题思路遇到这种原地操作数组的题,看起来要求跟第27题移除元素很相似,唯一的区别是把数组里所有的0移到末尾。小呆首先的思路是考虑用双指针算法,所以第一步是先将非0的元素移到前面。以示例代码为例:
1234567891011121314151617/** * @param {number[0, 1, 0, 3, 12]} nums * @return {void} Do not return anything, modify nums in-place instead. */var moveZ ...
LeetCode(27)移除元素
今天要练习的题目是:力扣(LeetCode)的第27题,移除元素
题目要求
给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:
123输入:nums = [0,1,2,2,3,0,4,2], val = 2输出:5, nums = [0,1,4,0,3]解释:函数应该返回新的长度5, 并且nums中的前五个元素均为0,1,3,0,4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为5 ,而 nums = [0,1,3,0,4,2,2,2] 或 nums = [0,1,3,0,4,0,0,0],也会被视作正确答案。
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
解题思路因为需要原地修改数组,并且无需考虑元素的顺序和数组中超出新 ...