双指针
傅里叶不想变换_
这个作者很懒,什么都没留下…
展开
-
18. 四数之和
思路:与三数之和类似,先固定前两个数,然后双指针。class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> ans = new ArrayList<>(); if(nums == null || nums.length <4) return ans; .原创 2021-06-03 09:52:05 · 35 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
思路:注意递增序列,看到递增序列首先一般联想到双指针或者二分法。class Solution { public int[] twoSum(int[] nums, int target) { int l = 0, r = nums.length - 1; while (l < r){ if (nums[l] + nums[r] == target){ return new int[]{nums[l], n.原创 2021-01-31 20:33:45 · 43 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
思路:双指针class Solution { public int[][] findContinuousSequence(int target) { List<int[]> res = new ArrayList<>(); for (int l = 1, r = 2; l < r;) { int sum = (l + r) * (r - l + 1) / 2; if (sum == ta.原创 2021-01-31 20:28:33 · 56 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
思路:双指针+滑动窗口,使用哈希表记录每个字母最后一次出现的位置。 public int lengthOfLongestSubstring2(String s) { Map<Character, Integer> map = new HashMap<>(); int left = 0, right = 0, res = 0; for (int i = 0; i < s.length(); i++) { .原创 2021-01-26 22:54:59 · 48 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
思路:双指针,curr表示当前指针,prev表示当前指针的下一个指针。反转:curr.next = prev移动位置:注意要先移动cur,再移动prev/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { pub.原创 2021-01-10 13:17:57 · 63 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
双指针: left 一直往右移,直到它指向的值为偶数,right 一直往左移, 直到它指向的值为奇数。交换完后左指针一定指的是奇数,右指针一定指的是偶数,故为了优化代码,可以 left++,right–以减少遍历次数。class Solution { public int[] exchange(int[] nums) { int left = 0, right = nums.length - 1; while(left < right){ .原创 2021-01-09 20:34:32 · 53 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
双指针法: l 一直往右移,直到它指向的值为偶数, r 一直往左移, 直到它指向的值为奇数,当 l 指向偶数,当 r 指向奇数时,交换两者指向的元素。class Solution { public int[] exchange(int[] nums) { int l = 0, r = nums.length - 1; while (l < r){ if ((nums[l] & 1) == 1){ .原创 2021-01-09 13:17:56 · 45 阅读 · 0 评论 -
Leetcode 763.划分字母区间
思路:双指针 由于同一个字母只能出现在同一个片段,显然同一个字母的第一次出现的下标位置和最后一次出现的下标位置必须出现在同一个片段。 在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了,此时前面出现过所有字母,最远也就到这个边界了。class Solution { public List<Integer> partitionLabels(String S) { List<Integer> .原创 2021-01-07 16:05:26 · 88 阅读 · 0 评论 -
Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
思路:双指针,二分双指针class Solution { public int[] searchRange(int[] nums, int target) { int low=0,high=nums.length-1; if(high==-1) return new int[]{-1,-1}; while(low<high){ if(nums[low]==target&&num.原创 2021-01-06 10:38:51 · 38 阅读 · 0 评论 -
Leetcode 209. 长度最小的子数组
思路:1.暴力,对于 num[i],如果num[i]~num[j]的和 >= s,则返回其长度 j - i + 1 2.快慢指针,慢指针start,快指针end,变量sum记录 num[start]~num[end]的值,如果sum < s, end右移 如果sum >= s,更新其长度。然后将 nums[start] 从 sum 中减去并将 start 右移暴力法class Solution { public int minSubArrayLen(int s, in.原创 2021-01-03 20:28:47 · 48 阅读 · 0 评论 -
Leetcode 121.买卖股票的最佳时机
思路:实质上是找数组中后一个元素与之前元素的最大差值暴力法:对于每组 i 和 j(其中 j > i)我们需要找出 max(prices[j] - prices[i])class Solution { public int maxProfit(int[] prices) { int ans = 0; int n = prices.length; for (int i = 0; i < n; i++) { for .原创 2021-01-03 15:24:36 · 95 阅读 · 0 评论 -
Leetcode 42. 接雨水
思路: 当前柱子 i 能接受的雨水为左边最高的柱子l_max,右边最高的柱子r_max中较矮的一个min, 如果min > 当前柱子的高度height[i], 则当前柱子能接收的水为 min - height[i]方法1:暴力法,左右维护一个最高柱子 public int trap(int[] height) { int n = height.length; int ans = 0; // 第一个柱子和最后一个柱子不会有雨水,所以 i .原创 2021-01-03 13:57:21 · 62 阅读 · 0 评论 -
Leetcode 26. 删除排序数组中的重复项
思路:数组已经排好序,所以重复元素一定是相邻的。使用两个指针 i 和 j ,其中 i 是慢指针, j 是快指针,当 num[i] != num[j]时,将要求删除重复元素,实际上就是将不重复的元素移到数组的左侧。考虑用 2 个指针,一个在前记作 p,一个在后记作 q,算法流程如下:1.比较 p 和 q 位置的元素是否相等。如果相等,q 后移 1 位如果不相等,将 q 位置的元素复制到 p+1 位置上,p 后移一位,q 后移 1 位重复上述过程,直到 q 等于数组长度。返回 p + 1,即为.原创 2021-01-02 00:17:50 · 42 阅读 · 0 评论 -
Leetcode 15. 三数之和
思路:这题跟15题,最接近的三数之和很像,但是难点在于去重。注意点: 当 nums[i]+nums[L]+nums[R]==0时,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,R 移到下一位置,寻找新的解优化:如果 nums[i]大于 0 则三数之和必然无法等于 0 ,结束循环class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(.原创 2021-01-01 22:58:17 · 47 阅读 · 0 评论 -
Leetcode 3. 无重复字符的最长子串
思路: 滑动窗口 什么是滑动窗口? 其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列! 如何移动? 我们只要把队列的左边的元素移出就行了,直到满足题目要求! 一直维持这样的队列,找出队列出现最长的长度时候,求出解!class Solution { public int lengthOfLongestSubstring(String s) { .原创 2021-01-01 11:39:50 · 69 阅读 · 0 评论 -
Leetcode-11 盛最多水的容器
暴力法:class Solution {// 暴力法 public int maxArea(int[] height) { if(height.length <= 1) return 0; int res = 0;//保存结果 for(int i = 0; i < height.length - 1; i++)//以i为左挡板,从O开始 { for(int j = height.lengt.原创 2020-12-18 11:31:44 · 41 阅读 · 0 评论 -
Leetcode 16. 最接近的三数之和
思路:排序+双指针class Solution { public int threeSumClosest(int[] nums, int target) { Arrays.sort(nums); int ans = nums[0] + nums[1] + nums[2]; for (int i = 0; i < nums.length; i++) { int l = i + 1, r = nums.length - 1; .原创 2020-12-27 19:41:48 · 62 阅读 · 0 评论