- 博客(191)
- 收藏
- 关注
原创 200. 岛屿数量
给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。我的思路:遍历所有元素,如果没被访问过,且为'1',则进行深度优先遍历,把周围所有水平或垂直相连的'1'都访问一遍,总共dfs了几次就是岛屿的数量代码如下:public class Solution { boolean[][] visited; public in.
2021-12-10 16:07:01 281
原创 199. 二叉树的右视图
给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。我的思路:层次遍历的框架下,每次当最后一次出队时加入结果即可代码如下:public class Solution { public List<Integer> rightSideView(TreeNode root) { if (root == null){ return new ArrayList<>();...
2021-12-10 15:42:51 471
原创 198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。我的思路:定义状态转移函数为偷第i个房间的最大收益状态转移方程为dp[i] = max{dp[i-2],...,dp[0]} + nums[i]代码如下:public int rob(int[]
2021-12-10 10:32:03 231
原创 197. 上升的温度
编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的id。我的思路:连续查询两次,前一个id的温度高于后一个id温度的即输出其中要用到DATEDIFF函数来实现日期类型的减法代码如下:selectw1.idfromWeatherw1,Weatherw2whereDATEDIFF(w1.RecordDate,w2.RecordDate)=1andw1.Temperature>w2.Temperature结果:...
2021-12-10 10:07:50 283
原创 191. 位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。我的思路:每次与1与完后判断是否为1,然后再将该数右移一位代码如下:public int hammingWeight(int n) { int res = 0; for (int i = 0; i < 32; i++) { if((n & 1) == 1){ res++; }
2021-12-10 09:32:08 104
原创 190. 颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位。我的思路:定义一个全0的32位数作为结果输出,然后每次都取n的最低位作为结果的(31-i)位,由于是无符号整数,所以需要使用无符号右移代码如下:public int reverseBits(int n) { int res = 0; for (int i = 0; i < 32; i++) { res = res | (n & 1) << (31 - i); n = n >
2021-12-10 09:19:19 309
原创 189. 轮转数组
给你一个数组,将数组中的元素向右轮转k个位置,其中k是非负数。我的思路:借助双端队列,每次将数组末尾的元素插入到数组的头,总共循环k次即可代码如下:public void rotate(int[] nums, int k) { Deque<Integer> queue = new LinkedList<>(); for (int i = 0; i < nums.length; i++) { queue.addLast(n...
2021-12-10 09:16:01 643
原创 187. 重复的DNA序列
所有 DNA 都由一系列缩写为 'A','C','G' 和 'T' 的核苷酸组成,例如:"ACGAATTCCG"。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。我的思路:将每个i到i+10存入set,如果set里已经有了,说明重复了,那么就可以加入结果列表中代码如下:public List<String> findRepeatedDnaSequences
2021-12-10 09:15:52 180
原创 186. 翻转字符串里的单词 II
给定一个字符串,逐个翻转字符串中的每个单词。我的思路:用栈存储每两个' '之间的字符数组,然后弹栈重新用' '拼接起来即可代码如下:public void reverseWords(char[] s){ Stack<List<Character>> stack = new Stack<>(); int i = 0; while (i < s.length){ int j = i; List&l.
2021-12-09 21:47:14 165
原创 184. 部门工资最高的员工
编写一个 SQL 查询,找出每个部门工资最高的员工。我的思路:先查每个部门最高的工资是多少,然后再查每个部门工资等于最高工资的员工代码如下:select distinct d.Name as `Department`,e.Name as `Employee`,e.Salary as `Salary`from Employee eleft join Department don e.DepartmentId = d.Idwhere (e.DepartmentId,e.Salary) in
2021-12-09 20:48:07 479
原创 183. 从不订购的客户
某网站包含两个表,Customers表和Orders表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。我的思路:用 NOT IN来查询不在另一个表的数据注:外连接只能查到两个表相同的属性,没法查到不相同的代码如下:select c.Name as `Customers`from Customers cwhere c.Id not in (select CustomerId from Orders)结果:...
2021-12-09 19:50:58 639
原创 182. 查找重复的电子邮箱
编写一个 SQL 查询,查找Person表中所有重复的电子邮箱。我的思路:查询该表两次,确保两次查询的数据的id不相同即可代码如下:select distinct a.Emailfrom Person a,Person bwhere a.Id = b.Id-1and a.Email = b.Email结果:...
2021-12-09 19:34:23 103
原创 181. 超过经理收入的员工
给定Employee表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。我的思路:查询两次表,第一次作为员工,第二次作为经理代码如下:select a.Name as `Employee`from Employee a,Employee bwhere a.ManagerId = b.Idand a.Salary > b.Salary结果:...
2021-12-09 19:26:10 111
原创 180. 连续出现的数字
编写一个 SQL 查询,查找所有至少连续出现三次的数字。思路:连续查该表三次,这三次查了连续的三个数字,若这三次查到的是同一个数字,则认为查到了代码如下:SELECT DISTINCT l1.Num AS ConsecutiveNumsFROM Logs l1, Logs l2, Logs l3WHERE l1.Id = l2.Id - 1 AND l2.Id = l3.Id - 1 AND l1.Num = l2.Num AND l2.
2021-12-09 19:12:22 156
原创 179. 最大数
给定一组非负整数nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。代码如下:classSolution{publicStringlargestNumber(int[]nums){PriorityQueue<String>heap=newPriorityQueue<>((x,y)->(y+x).compareTo(x+y));for(intx:nums)he...
2021-12-09 10:46:31 197
原创 178. 分数排名
编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。思路:想要知道自己的分数排名第几,只需要查询其他人中比自己的分数高的有多少人就行了,其中因为要求分数相同排名相同,所以需要查询比自己分数高的有多少种就行了代码如下:select a.Score as Score,(select count(distinct b.Score) from Scores b where b
2021-12-09 09:32:36 101
原创 177. 第N高的薪水
编写一个 SQL 查询,获取Employee表中第n高的薪水(Salary)。思路和176一样,只不过多了如何在sql语句中加入变量代码如下:CREATEFUNCTIONgetNthHighestSalary(NINT)RETURNSINTBEGINdeclaremINT;setm=N-1;RETURN(#WriteyourMySQLquerystatementbelow.select...
2021-12-09 09:16:54 1624
原创 176. 第二高的薪水
编写一个 SQL 查询,获取Employee表中第二高的薪水(Salary)。1.使用distinct来实现去重2.使用order by xxx desc 进行降序排序3,使用limit offset,size从第二行开始取一个元素4.额外使用select (select .....) as xxx实现查不到输出空代码如下:select (select distinct Salary from Employee order by Salary de...
2021-12-09 09:11:24 94
原创 175. 组合两个表
外连接是将主表的所有行都输出一遍假设A外联B,则是把A的所有都查出来,其中包括和B连接的以及不和B连接的而A内联B,则是把A中所有和B连接的查出来代码如下:selectFirstName,LastName,City,StatefromPersonpleftjoinAddressaonp.PersonId=a.PersonId总结:①A inner join B:取交集②A left join B:取A全部,B没有对应的值,则为null③A ...
2021-12-08 22:21:53 95
原创 173. 二叉搜索树迭代器
我的思路:借助队列来实现代码如下:public class BSTIterator { Queue<TreeNode> queue = new LinkedList<>(); public BSTIterator(TreeNode root) { midOrder(root); } public int next() { TreeNode node = queue.poll(); re...
2021-12-08 21:14:29 98
原创 172. 阶乘后的零
给定一个整数n,返回n!结果中尾随零的数量。我的思路:尾随零的个数取决于每个乘数可以分解为多少个5相乘,如25可以分成5*5代码如下:public int trailingZeroes(int n) { int res = 0; for (int i = 5; i <= n; i+=5) { int val = i; while (val != 0 && val % 5 == 0){ val ...
2021-12-08 20:40:07 115
原创 171. Excel 表列序号
代码如下:public int titleToNumber(String columnTitle) { int length = columnTitle.length(); int res = 0; for (int i = 0; i < length; i++) { int val = columnTitle.charAt(i) - 'A' + 1; res = res * 26 + val; } return re...
2021-12-08 19:57:08 117
原创 169. 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。我的思路:用哈希表存储(元素-次数),一旦次数>n/2,则返回该元素代码如下:public int majorityElement(int[] nums) { int length = nums.length; Map<Integer, Integer> map = new HashMap<..
2021-12-08 19:43:44 199
原创 168. Excel表列名称
我的思路:除数为26,每次将商作为新的被除数,从头插入得到的余数对应的字母但当可以被26整除时,插入'Z'的同时还需要将被除数-1代码如下:public String convertToTitle(int columnNumber) { StringBuffer sb = new StringBuffer(); while (columnNumber != 0){ int remainder = columnNumber % 26; if ...
2021-12-08 14:02:24 84
原创 167. 两数之和 II - 输入有序数组
我的思路:双指针,如果left+right>target则right--;反之left++代码如下:public int[] twoSum(int[] numbers, int target) { int length = numbers.length; int left = 0; int right = length-1; while (left < right){ if (numbers[left] + numbers[righ...
2021-12-08 10:40:01 151
原创 166. 分数到小数
给定两个整数,分别表示分数的分子numerator 和分母 denominator,以 字符串形式返回小数 。如果小数部分为循环小数,则将循环的部分括在括号内。如果存在多个答案,只需返回 任意一个 。思路:模拟除法,借助哈希表来判断是否出现循环代码如下:public String fractionToDecimal(int numerator, int denominator) { long numeratorLong = numerator; long de..
2021-12-08 10:31:42 105
原创 165. 比较版本号
我的思路:挨个比较version1和version2的两个'.'之间的值即可代码如下:public int compareVersion(String version1, String version2) { int len1 = version1.length(); int len2 = version2.length(); int start1 = 0; int start2 = 0; while (start1 < len1 || sta...
2021-12-08 09:35:41 139
原创 162. 寻找峰值
峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设nums[-1] = nums[n] = -∞ 。你必须实现时间复杂度为 O(log n) 的算法来解决此问题。官方思路:在上述算法中,如果我们固定选取 i为 [l, r]的中点,那么每次可行的下标范围会减少一半,成为一个类似二分查找的方法,时间复杂度为 O(logn)。代码如下:class Solu..
2021-12-07 22:15:21 298
原创 150. 逆波兰表达式(后缀表达式)求值
根据逆波兰表示法,求表达式的值。我的思路:借用栈,如果不是运算符就入栈,如果是就弹出栈内两个数进行计算,将计算后的结果再次入栈代码如下:public class Solution { int count = 0; StringBuilder s = new StringBuilder(); Stack<String> stack = new Stack<>(); boolean[] visited; public String.
2021-12-07 21:16:13 214
原创 148. 排序链表
给你链表的头结点head,请将其按 升序 排列并返回 排序后的链表 。我的思路:采用归并排序,找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2步,慢指针每次移动 1步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。对两个子链表分别排序。将两个排序后的子链表合并,得到完整的排序后的链表。可以使用「21. 合并两个有序链表」的做法,将两个有序的子链表进行合并。代码如下:public class Solu...
2021-12-07 21:16:03 416
原创 147. 对链表进行插入排序
对链表进行插入排序。我的思路:代码如下:class Solution { public ListNode insertionSortList(ListNode head) { if (head == null) { return head; } ListNode dummyHead = new ListNode(0); dummyHead.next = head; Lis...
2021-12-07 21:15:11 199
原创 160. 相交链表
我的思路:定义一个列表用于存储headA链表的所有节点,然后遍历headB,如果出现相同的节点即可要求的相交节点代码如下:public ListNode getIntersectionNode(ListNode headA, ListNode headB) { List<ListNode> list = new ArrayList<>(); ListNode temp = headA; while (temp != null){ ...
2021-12-07 21:14:13 94
原创 155. 最小栈
我的思路:需要定义一个辅助列表来存储排好序的元素序列,然后每次只需要取第一项便可以实现常数时间的检索最小元素代码如下:public class MinStack { List<Integer> list; List<Integer> minList; public MinStack() { list = new ArrayList<>(); minList = new ArrayList<&g...
2021-12-07 20:13:19 197
原创 153. 寻找旋转排序数组中的最小值
我的思路:采用二分搜索,如果mid比两边高,则往右搜索,如果mid比两边低,则判断mid是不是最低,如果是则输出,如果不是则往左搜索代码如下:public int findMin(int[] nums) { int length = nums.length; if (nums[0] < nums[length-1]){ return nums[0]; } int low = 0; int high = length-1; ...
2021-12-07 19:50:56 199
原创 152. 乘积最大子数组
给你一个整数数组nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。我的思路:本题与53. 最大子序和的区别在于只看前i-1个数的最大值和第i个数是不够的以2,3,-2为例F(2)需要看max{{2},{2,3},{3}}F(3)需要看max{{2},{3},{-2},{2,3},{3,-2},{2,3,-2}}而根据F(2)我们知道{2},{3},{2,3}谁大只需要通过F(2)就可以知道了,如果没有负数,那么{2,3}再乘一个值..
2021-12-07 10:59:01 167
原创 151. 翻转字符串里的单词
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。我的思路:每次遍历到第一个不是空格的字符时,进行循环将整个单词入栈,最终弹栈用空格拼接即可代码如下:public String reverseWords(String s) { int length = s.length(); Stack<String> stack
2021-12-07 09:34:17 141
原创 146. LRU 缓存机制
至于为什么是头部,是因为put操作,get操作本身是没有影响的,而put操作在达到容量上限的时候想要以O(1)的时间复杂度删掉最久未使用的节点,就只能通过排序把它排在末尾,然后直接索引末尾即可public class LRUCache { class DLinkedNode { int key; int value; DLinkedNode prev; DLinkedNode next; public D...
2021-11-27 17:24:55 94
原创 145. 二叉树的后序遍历
给定一个二叉树,返回它的后序遍历。代码如下:public class Solution { List<Integer> res = new ArrayList<>(); public List<Integer> postorderTraversal(TreeNode root) { if (root == null){ return res; } postorder(r..
2021-11-27 16:23:18 165
原创 144. 二叉树的前序遍历
给你二叉树的根节点root,返回它节点值的前序遍历。代码如下:public class Solution { List<Integer> res = new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root) { if (root == null){ return res; } p...
2021-11-27 16:20:19 89
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人