leetcode精选
蒙面侠1024
这个作者很懒,什么都没留下…
展开
-
力扣15. 三数之和
原题链接双指针算法:定义两个指针,一个l,一个r数组进行排序,从头开始遍历,因为数组现在已经是有序的了,分为下面三种情况1.当nums[i]+nums[l]+nums[r]==0,找到了一个答案,进行记录,此时i是不动的,l和r指针向内收缩,寻找是否还有其他符合条件的数据。2.当nums[i]+nums[l]+nums[r]<0,因为r已经是整个数组的最大值,三个数加起来还不是0的话,说明l指向的数据太小了,所以l向右移动;3.当nums[i]+nums[l]+nums[r]>0,减原创 2021-07-26 23:36:38 · 123 阅读 · 0 评论 -
力扣5. 最长回文子串
原题链接根据回文串的一个核心思想来解题:从中心点往两边扩散,来寻找回文串,这种方向相当于穷举字符串中每一个字符为中心点。假设回文串是奇数时,比如 “bab” ,它的中心点就只有一个 “a”,所以从 “a” 开始向两边扩散假设回文串是偶数时,比如 “baab”,它的中心点有两个 “aa”,所以从 “aa” 开始向两边扩散编写一个辅助函数来寻找回文串,当中心点确定了之后调用辅助函数,直接返回找到的回文串将每次找到的回文串与之前的做对比,谁长就留谁。class Solution { // 主函原创 2021-07-26 20:28:31 · 98 阅读 · 0 评论 -
力扣206 反转链表
一、定义pre,next,cur节点存储前一个节点,下一个结点,以及当前节点。初始化pre指向null,cur指向头节点二、next暂存下一个节点。三、当前节点指向前一个节点,此时pre为null。四、pre暂存当前节点。pre指向cur。五、处理下一个节点。cur指向下一个节点。第二次循环最后返回pre指针。class Solution { public ListNode reverseList(ListNode head) { ListNode pre原创 2021-07-26 18:32:23 · 95 阅读 · 0 评论 -
【力扣】比特位计数 JAVA
解法一:java内置API Integer.bitCount()class Solution { public int[] countBits(int n) { int[] a=new int[n+1]; for(int i=0;i<=n;i++){ a[i]=Integer.bitCount(i); } return a; }}解法二:找规律:如果 i 为偶数,那么f(i) = f.原创 2021-07-13 20:00:12 · 180 阅读 · 0 评论 -
【力扣】子集 JAVA
直接遍历,遇到一个数就把所有子集加上该数组成新的子集,遍历完毕即是所有子集。以1,2,3为例:class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> res = new ArrayList<>(); res.add(new ArrayList<>()); fo.原创 2021-07-13 17:55:58 · 142 阅读 · 0 评论 -
【力扣】盛最多水的容器 JAVA
使用双指针,一个指向数组的头,一个指向尾,指针对应的数值小的向内移动,才能构成最大的面积。class Solution { public int maxArea(int[] height) { int n=height.length; int l=0; int r=n-1; int max=0; while(l<r){ max=Math.max((r-l)*Math.min(height.原创 2021-07-13 17:28:49 · 143 阅读 · 0 评论 -
【力扣】两数之和 JAVA
解法一:双重循环,暴力解class Solution { public int[] twoSum(int[] nums, int target) { int n=nums.length; for (int i = 0; i < n; i++) for (int e = i + 1; e < n; e++) if (nums[i] + nums[e] == target) ..原创 2021-07-13 15:40:06 · 515 阅读 · 0 评论 -
【力扣】整数反转 JAVA
题目给出提示,输入数据在int范围内,前面不用加判断,因为反转后数据可能可能爆int,所以在输出之前进行判断是否超过int的数据范围。题解一:该题解采用JAVA字符串处理,先将整数转换为字符串,再用StringBuffer里的reverse反转字符串,最后把负号替换。循环除去反转后开头的0,使用Long转换字符串,再强制转换为int,判断未转换之前是否相等,如果不相等就已经爆int了,返回0即可;最后判断x是否大于0,保持数据的正负号。class Solution { public int..原创 2021-07-13 15:25:19 · 176 阅读 · 0 评论 -
【贪心】45. 跳跃游戏 II
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。说明:假设你总是可以到达数组的最后一个位置。class Solution { public int jump(int[] nums) {原创 2021-03-27 23:19:23 · 83 阅读 · 0 评论 -
【贪心】55. 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下原创 2021-03-27 22:26:41 · 64 阅读 · 0 评论 -
【贪心】53. 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。class Solution { public int maxSubArray(int[] nums) { int max=Integer.MIN_VALUE; int sum=0; for(int i=0;i&l原创 2021-03-27 17:02:49 · 89 阅读 · 0 评论 -
【贪心】376. 摆动序列
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来原创 2021-03-27 16:34:03 · 71 阅读 · 0 评论 -
【大顶堆】451. 根据字符出现频率排序
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。示例 1:输入: “tree”输出: “eert”解释: 'e’出现两次,'r’和’t’都只出现一次。 因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。示例 2:输入: “cccaaa”输出: “cccaaa”解释: 'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。 注意"cacaca"是不正确的,因为相同的字母必须放在一起。示例3:输入: “Aabb”输出: “bbAa”原创 2021-03-26 10:48:12 · 62 阅读 · 0 评论 -
【大顶堆/小顶堆】215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4解法1:大顶堆定义优先队列,重写比较器,实现大顶堆,所有数据入队列,将前k个数依次出队,ans等于第k个出队的数,也就是第k大的数class Solution { public int findKthL原创 2021-03-25 20:28:46 · 207 阅读 · 0 评论 -
【小顶堆+数组】973. 最接近原点的 K 个点
我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。示例 1:输入:points = [[1,3],[-2,2]], K = 1输出:[[-2,2]]解释: (1, 3) 和原点之间的距离为sqrt(10), (-2, 2) 和原点之间的距离为 sqrt(8),由于 sqrt(8) < sqrt(10),(-2, 2)离原点更原创 2021-03-25 20:13:55 · 60 阅读 · 0 评论 -
【大顶堆+数组】347.前 K 个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]class Solution { public int[] topKFrequent(int[] nums, int k) { Map<Integer,Integer> map=new HashMap<>();原创 2021-03-25 19:02:50 · 78 阅读 · 0 评论 -
【栈】逆波兰表达式求值
题目:根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。示例 1:输入:tokens = [“2”,“1”,"+",“3”,"*"]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) *3) = 9示例 2:输入:tokens = [“4”,“13”,“5”,"/","+"]输出:6解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6示例 3:输入:tokens原创 2021-03-22 18:26:29 · 58 阅读 · 0 评论 -
【大顶堆】最小的k个数
题目:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]限制:0 <= k <= arr.length <= 10000 0 <= arr[i] <= 10000我们用一个大根堆实时维护原创 2021-03-22 18:13:46 · 236 阅读 · 0 评论