leetcode刷题
黄子何
爱好篮球。
展开
-
刷Leetcode学sql
标题175. 组合两个表176. 第二高的薪水182. 查找重复的邮箱184. 部门工资最高的员工知识点汇总:175:LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。 右表没有记录的行会以NULL显示。176: 临时表的性质, IFNULL182: 查重可以用 group by XX having count(*)184: 元组可以多个字段 in 比如 (DepartmentId , Salary原创 2021-03-21 18:28:38 · 341 阅读 · 0 评论 -
【leetcode24】两两交换链表中节点
public ListNode swapPairs(ListNode head) { if (head == null || head.next == null) { return head; } ListNode dummy = new ListNode(-1); dummy.next = head.next; ListNode first = head; ListNode s...原创 2021-03-19 13:57:56 · 51 阅读 · 0 评论 -
判断是否为子序列【通用代码】
判断target是否为s的子序列利用双指针的思想,i指向S的元素, j指向target的元素。然后遍历。 public static boolean isSub(String s, String target) { int i = 0; int j = 0; int lenS = s.length(); int lenT = target.length(); if (lenS < lenT) { return false; } while (i < len原创 2021-02-20 10:29:36 · 351 阅读 · 0 评论 -
【88. 合并两个有序数组】
题目解答从尾开始遍历,因为从头开始遍历需要移动元素,否则会将一些元素覆盖掉。class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int p = m - 1; int q = n - 1; int index = m + n - 1; while (p >= 0 && q >= 0) {原创 2021-02-17 12:01:00 · 71 阅读 · 0 评论 -
【26. 删除排序数组中的重复项】
题目解法双指针如果nums[i] == nums[j] 说明还是重复项,j继续++如果nums[i] != nums[j] 则将nums[j]移到nums[i+1]处class Solution { public int removeDuplicates(int[] nums) { int i = 0; for (int j = 1;j < nums.length;j++) { if (nums[i] != nums[j]原创 2021-02-06 08:49:54 · 49 阅读 · 0 评论 -
【leetcode 滑动窗口】
滑动窗口的思想滑动窗口可以套用模板:int left = 0;int max;for (int right = 0;right < s.length(); right++) { // 当字符串不符合要求时,才向右滑动左指针left }leetcode 3. 无重复字符的最长子串class Solution { public int lengthOfLongestSubstring(String s) { int left = 0; int原创 2021-02-05 21:33:01 · 81 阅读 · 0 评论 -
【leetcode 2. 两数相加】
题目题解class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int carry = 0; ListNode res = new ListNode(-1); ListNode p = res; while (l1 != null && l2 != null) { int sum = l1.val原创 2021-02-05 11:18:23 · 57 阅读 · 0 评论 -
【剑指 Offer 21. 调整数组顺序使奇数位于偶数前面】
题目快慢指针法需要注意的就是里面while循环的 left < right 判断条件, 因为如果没有这个判断条件,可能会导致 left和right超出数组的范围class Solution { public int[] exchange(int[] nums) { int left = 0; int right = nums.length - 1; while (left < right) { while (原创 2021-02-03 15:31:08 · 42 阅读 · 0 评论 -
【剑指 Offer 07. 重建二叉树】
题目题解/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { int[] p; // 保存某个结点在中序遍历的下标,用于快速找到中序遍历的根节点 Map原创 2021-01-29 18:02:48 · 48 阅读 · 0 评论 -
【剑指 Offer 14- I. 剪绳子】
题目思路dp[i] 代表长度为i的绳子获得的最大乘积那么对于长度为i的绳子,就有两种剪法① 剪去长度j,剩下的绳子不再剪,乘积为 j * (i - j)② 剪去长度j,剩下的绳子继续剪,剪出剩下绳子能获得的最大乘积,即dp[i - j]然后比较这两种剪法,取最大乘积者即可。class Solution { public int cuttingRope(int n) { int[] dp = new int[n + 1]; dp[1] = 1;原创 2021-01-29 13:31:50 · 61 阅读 · 0 评论 -
【剑指 Offer 13. 机器人的运动范围】
题目关键点① 数位之和的特征很好理解,当进位时,十位加一,个位减9,当不进位时,只是个位加1。 (x+1) % 10 != 0 ? s_x + 1 : s_x - 8;原创 2021-01-25 23:00:00 · 72 阅读 · 0 评论 -
【剑指 Offer 12. 矩阵中的路径】
题目dfs解决class Solution { static int m,n; static String w; char[][] b; public boolean exist(char[][] board, String word) { // 用静态变量保存,方便写代码 m = board.length; n = board[0].length; w = word; b = board;原创 2021-01-11 22:48:09 · 50 阅读 · 0 评论 -
二分法的写法小细节
问为什么官方的二分法的题解很多都是写的low + (high - low) // 2 而不是 (high + low) // 2答因为low+high在low和high特别大的时候可能会造成溢出,使用减法避免了溢出发生原创 2021-01-11 14:16:33 · 293 阅读 · 0 评论 -
【剑指 Offer 10- I. 斐波那契数列】
题目递归写法因为递归会导致很多重复计算,所以利用一个map存储结果,避免重复计算。class Solution { Map map = new HashMap<Integer,Integer>(); public int fib(int n) { if (n == 0) { return 0; } else if (n == 1) { return 1; }原创 2021-01-10 23:14:23 · 58 阅读 · 0 评论 -
反转链表的两种方法
递归public ListNode reverseList(ListNode head) { if (head == null || head.next == null) return head; ListNode tempList = reverseList(head.next); head.next.next = head; head.next = null; return tempList;}非递归public ListNode re原创 2021-01-10 11:01:20 · 431 阅读 · 2 评论 -
【剑指 Offer 04. 二维数组中的查找】
题目暴力遍历时间复杂度 O(m * n)空间复杂度 O(1)线性查找class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { int n = matrix.length; if (n == 0) { return false; } int m = matrix[0].length;原创 2021-01-10 10:39:39 · 48 阅读 · 0 评论 -
【剑指 Offer 03. 数组中重复的数字】
题目这道题目看似简单,但是实际上有很多解法,另外这题有实际的意义,比如一种业务场景,需要用户输入数字对一些东西排序,那么就可以利用这种算法来进行校验,防止出现排序重复的情况。原地置换法核心思想:一个萝卜一个坑,由于长度为n的数组内所有数字都在1~n-1,那么元素与下标之间就可以存在一一对应的关系,即将’正确‘的元素放到‘正确’的位置,把0放到nums[0],把1放到nums[1]…如果’正确‘的位置上已经存在了’正确‘的元素了,说明该位置的元素就是重复的元素,返回即可如果‘正确’的位置上没有存放原创 2021-01-09 22:05:58 · 65 阅读 · 0 评论 -
【leetcode141】链表求环
利用快慢指针的思想 public boolean hasCycle(ListNode head) { if(head==null||head.next==null) return false; ListNode fast = head; ListNode slow = head; while(fast!=null&&fast.next!=null){ fast = fast.ne原创 2020-07-14 13:22:45 · 96 阅读 · 0 评论 -
【LeetCode--215】数组中的第K个最大元素----个人理解
题目思路主要是利用java中的优先队列来解决这个问题,因为优先队列底层就是一个最大堆或者最小堆。这题中,是求第K个最大元素,所以我们要用最小堆来作做为数据结构。算法思想: 先按数组顺序将K个元素加入的优先队列中,这时候优先队列的peek()就是这K个元素中最小的那个,然后继续遍历数组,如果当前元素比堆顶的元素要大,那么就把堆顶元素poll() (也就是出队),将当前元素入队。我的理解: 假设数组大小为N,那么就类似N个人要竞争K个席位(K<N)。首先就按先来后到的顺序,暂时把前面K个人放入原创 2020-05-30 15:52:16 · 96 阅读 · 0 评论 -
贪心算法---452. 用最少数量的箭引爆气球
【leetcode】452. 用最少数量的箭引爆气球核心思想① 将端点从小到大排序, 可以按左端点,也可以按右端点② 直接给第一个气球分配一支箭,然后这支箭尽可能射爆其他的气球,不能射爆时再分配第二支箭③ 方法二会简单一些,因为不用考虑 包含关系,只有交集的关系方法一 左端点排序public int findMinArrowShots(int[][] points) { if(points.length==1) return 1; if(p原创 2020-05-27 22:14:16 · 213 阅读 · 0 评论