LeetCode算法热题100题目和思路


LeetCode算法热题100的题目和思路
人生不像做饭,不能等万事俱备了才下锅


1、两数之和

题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值的两个整数,并返回它们的数组下标。
例如:输入:nums = [2,7,11,15], target = 9,输出:[0,1]
思路:构建哈希表,key为数组中的值,value为数组下标

2、两数相加

题目: 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储 一位 数字。
例如:2->4->3 + 5->6->4 = 7->0->8
思路:遍历两个链表,尾插法创新新链表

5、最长回文子串

题目: 给你一个字符串 s,找到 s 中最长的回文子串。例如:输入:s = “babad”,输出:“bab”。
思路:1、对于字符串每一个元素,分别以一个元素为中心和以两个元素为中心向两边扩展;
2、动态规划,状态转移方程为res[i][j] = res[i+1][j-1] && (s[i] == s[j]);

3、无重复字符的最长子串

题目: 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。例如:输入: s = “abcabcbb”,输出: 3,也就是“abc”。
思路:构建哈希表记录每个字符上次出现的值,没出现过或者距离大于当前最长字串,则继续加1,否则将该距离作为最长字串。

206、反转链表

题目: 反转一个单链表。例如:输入: 1->2->3->4->5->NULL,输出: 5->4->3->2->1->NULL。
思路:迭代,遍历依次反转;递归,连接头结点和之后结点。

15、三数之和

题目: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
例如:输入:nums = [-1,0,1,2,-1,-4],输出:[[-1,-1,2],[-1,0,1]]
思路:固定一个值,双指针找之后的两个值,变为求两数之和。

70、爬楼梯

题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
思路:迭代和递归

20、有效的括号

题目: 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
思路:遍历使用栈

21、合并两个有序链表

题目: 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。例如:输入:l1 = [1,2,4], l2 = [1,3,4],输出:[1,1,2,3,4,4]
思路:迭代,连接头结点和之后结点。

46、全排列

题目: 给定一个 没有重复 数字的序列,返回其所有可能的全排列。
思路:迭代,第一个位置依次与其他值交换,然后与其他位置结果进行组合。

4、寻找两个正序数组的中位数

题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数 。例如:输入:nums1 = [1,3], nums2 = [2],输出:2.00000
思路:二分查找,每次排除k/2的值

42、接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。例如:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1],输出:6
思路:1、单调递减栈,栈顶元素最小,注意如何计算弹出时当前位置的积雨量
2、双指针,对于左指针,当左边高度低于右边,那么左边最大高度必小于右边,那么积水量取决于LeftMax-Left,右边同理,左右指针相遇时结束循环。

53、最大子序和

题目: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。例如:输入:nums = [-2,1,-3,4,-1,2,1,-5,4],输出:6。
思路:遍历数组,小于0则重置为0,记得设置ans为INT_MIN,设置为0可能会有全负数组。

11、盛水最多的容器

题目: 给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。例如:输入:[1,8,6,2,5,4,8,3,7],输出:49。
思路:双指针,移动高度小的指针,也就是减少宽度来争取高度更高的可能,两指针相遇时退出循环。

406、根据身高重建队列

题目: 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面正好有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。例如:输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]],输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]。
思路:按身高从大到小进行排序,同时对于相同身高的人,前面人数多的在后面,然后按照每人前面的人数来填充队列。由于身高是从高到低的,依次插入时,例如某人前面有4个人,那么插入到索引为4的位置。
C++匿名函数 sort(people.begin(), people.end(), [](const vector<int> u, const vector<int> v) {return u[0] > v[0] || (u[0] == v[0] && u[1] < v[1]); });

31、下一个排列

题目: 实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。例如:输入:nums = [1,2,3],输出:[1,3,2]
思路:分为三部,首先从尾部开始,找到第一个正增对,记录其中较小的数。然后从尾部找一个比这个数稍大的数,二者交换位置。最后将剩下的这部分序列翻转。

146、LRU缓存机制

题目: 实现 LRUCache 类:
LRUCache(int capacity) 以正整数作为容量
capacity 初始化LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
思路:使用哈希表记录key值,使用双向链表记录常用节点,具体代码见设计LRU缓存结构以及如何构建双向链表

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值