
算法题
Yangshiwei....
好好努力
展开
-
力扣 1686. 石子游戏 VI
题目:分析:因为每个人对石子的价值不同,所以这个石子的总价值其实等于二者相加之和,因为你拿走这个石子后对方就没法得到拿到这个石子的分了,我们把这个总分值进行排序,然后每次取最前,然后最后统计两个的真实分值即可。代码:class Solution { public int stoneGameVI(int[] aliceValues, int[] bobValues) { int[][] arr=new int[aliceValues.length][2];原创 2022-02-18 23:24:35 · 3399 阅读 · 0 评论 -
力扣 4. 寻找两个正序数组的中位数
题目:分析:用归并排序的思想,但可以不用合并数组,只需要找到其中位数即可。代码:class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int i=0,j=0,l=0; double d=0,m=0; int n=(nums1.length+nums2.length)/2; while(l!=n){原创 2022-02-17 19:49:52 · 7829 阅读 · 0 评论 -
力扣 1306. 跳跃游戏 III
题目:分析: 新建一个boolean数组,把能到达的地方标为true,最后遍历一遍是否存在等于0且能到达的坐标。代码:class Solution { public boolean canReach(int[] arr, int start) { boolean[] brr=new boolean[arr.length]; Queue<Integer> q=new LinkedList(); q.off...原创 2022-02-17 19:02:59 · 2322 阅读 · 0 评论 -
力扣 200. 岛屿数量
题目:分析:遍历一遍数组,在查询到一个‘1’时,就优先遍历一遍他们所有上下左右是‘1’的地方并改变值。代码:class Solution { public int numIslands(char[][] grid) { int sum=0; for(int i=0;i<grid.length;i++){ for(int j=0;j<grid[0].length;j++){ .原创 2022-02-17 09:29:07 · 9213 阅读 · 0 评论 -
力扣 199. 二叉树的右视图
题目:分析:层次遍历二叉树,每层的最后一个放入list链表中代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNo.原创 2022-02-16 23:23:12 · 6949 阅读 · 0 评论 -
力扣 剑指 Offer 32 - III. 从上到下打印二叉树 III
题目:分析:深度遍历这棵树,然后判断当前层数,若为偶数层,该list反转。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public L.原创 2022-02-16 22:46:30 · 238 阅读 · 0 评论 -
力扣 142. 环形链表 II
题目:思路: 判断链表成环,可以使用快慢指针,如果指针先遍历到null,则不成环,若二者相重叠,则成环,判断入环点有两个方法,1在重叠时,新加一个从head开始的结点,和重叠点一起next,下一个重叠点为入环点,2是用hash把快指针到过的地方进行标记。代码:哈希+快慢指针:/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode ne...原创 2022-02-14 09:31:43 · 156 阅读 · 0 评论 -
力扣 146. LRU 缓存
题目:分析:可以用哈希表加一个双向链表来实现,size记录当前缓存中数据量,capacity存缓存中数据可以容纳的最大量,也是初始化类的时候带的入参,first,last两个节点分别代表双向链表的头和尾,使用尾插法插入数据,尾结点的前一个结点为最近使用结点,头结点的下一个结点为最近不常用结点,也就是LRU算法中被替换掉的那一个,hash负责存索引,如果哈希中有这个索引值,则他在缓存中,否则不在。代码:class LRUCache { class Node{ .原创 2022-02-13 23:44:36 · 361 阅读 · 0 评论 -
力扣 1189. “气球” 的最大数量
题目:分析:首先应该统计气球单词出现的相关字母的所有次数,然后我们发现这个单词中,l和o出现了两次,其他的都只出现了一次,于是我们把他们除2向下取整,然后找出五个单词的最小值即可。代码:class Solution { public int maxNumberOfBalloons(String text) { int [] a=new int[5]; for(int i=0;i<text.length();i++){ .原创 2022-02-13 12:40:51 · 252 阅读 · 0 评论 -
力扣 145. 二叉树的后序遍历
题目:分析:后序遍历,即先左节点,后右节点,最后自身结点,前中后序遍历之间相差的也就是顺序不同,代码交换一下位置即可代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this原创 2022-02-12 23:29:18 · 684 阅读 · 0 评论 -
力扣 144. 二叉树的前序遍历
题目:分析:先序遍历就是先自身结点,然后左节点,最后右节点,我们可以写一个递归函数来实现。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; .原创 2022-02-12 23:26:15 · 150 阅读 · 0 评论 -
力扣 面试题 04.01. 节点间通路
题目:分析: 这可以用建立邻接表的形式来做,用一个hashmap存放每个结点能指向哪些结点,然后将start放入队列,找出对应key值中能到达且没访问过的结点,放入队列并把相应布尔数组的值置为true,若队列空了则没有通路。代码:class Solution { public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) { boolean[...原创 2022-02-12 23:21:08 · 382 阅读 · 0 评论 -
力扣 1020. 飞地的数量
题目:分析: 如果他能跨越边界,首先需要一个与边界相邻的1,否则没法进行,于是我们可以开始的时候遍历每个节点,把为1的边界结点记录下来放入队列,并修改1的值(便于与未遍历到的1区分),然后记录不为1的非边界结点的数量sum,然后在队列中取出每个一边界节点,判断其上下左右是否有未遍历到的1,有则总数sum减1,并将该节点放入队列,直到队列为空,此时sum的值为我们要求的值。代码:class Solution { public int numEnclaves(int...原创 2022-02-12 21:41:45 · 228 阅读 · 0 评论 -
力扣 25. K 个一组翻转链表
题目:分析: 这题主要考察链表的反转,我们需要一个链表反转的函数fz(),需要讲解的可以查看我之前的博客,主函数我们需要把整条链切成n个k个结点的链表(最后一个可能不是),然后对每个小链表进行反转,并记录下他们的头尾节点方便将各个小链表之间串联起来。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; *...原创 2022-02-11 21:55:59 · 115 阅读 · 0 评论 -
力扣 1984. 学生分数的最小差值
题目:分析:我们可以先让这个数组有序,要使得最小,则在有序状态下这几个人必须是相邻的,根据k的大小取相邻数量的差值来进行比较代码:class Solution { public int minimumDifference(int[] nums, int k) { if(k==1){ return 0; } Arrays.sort(nums); int min=nums[nums.leng原创 2022-02-11 12:47:53 · 645 阅读 · 0 评论 -
力扣 1447. 最简分数
题目:分析:最简分数需要分子和分母二者的最大公因数是1,用辗转相除法判断最大公因数即可。代码:class Solution { public List<String> simplifiedFractions(int n) { List<String> list=new ArrayList<String>(); for(int i=2;i<=n;i++){ for(int j=1原创 2022-02-10 23:02:05 · 59 阅读 · 0 评论 -
力扣 2006. 差的绝对值为 K 的数对数目
题目:分析: 看题首先想到了哈希存每个数出现的次数,在遍历数组时只需要把这个数出现的次数+1,并查出这个数+-2的两个数出现的次数相加到总数中,在遍历完数组后就得到了结果。代码:class Solution { public int countKDifference(int[] nums, int k) { HashMap<Integer,Integer> hash=new HashMap<Integer,Integer>(...原创 2022-02-09 15:11:08 · 330 阅读 · 0 评论 -
力扣 50. Pow(x, n)
分析:这题字面看是直接用一个for循环的事,但那样太浪费时间了,所以我们要找更好的办法,比如递归。 递归的话就是理解x的2n次方等于x的n次方乘x的n次方递归:class Solution { public double myPow(double x, int n) { if(n==0){ return 1; } if(n>0){ double d...原创 2022-02-07 19:17:24 · 624 阅读 · 0 评论 -
力扣 1748. 唯一元素的和
题目:分析:本题一看就是运用哈希表,存入出现数字的次数,然后找出出现一次的加起来。 但后面思考一下,其实可以在数字第一次出现的时候,直接相加,并存入一个规定的字符,然后在后面发现哈希表中已经存在时,判断他是否在之前只出现了一次,是的话减去这个数组并改变存入的字符。代码:class Solution { public int sumOfUnique(int[] nums) { HashMap<Integer,Integer> ha...原创 2022-02-06 16:44:30 · 402 阅读 · 0 评论 -
力扣 1725. 可以形成最大正方形的矩形数目
题目:分析: 这题其实也就是比大小,首先选出每个矩阵的最小边,记录,然后再从所有矩阵中选出最小边里最大的那个,记录其个数。代码:class Solution { public int countGoodRectangles(int[][] rectangles) { int maxlen=0; int sum=0; for(int i=0;i<rectangles.length;i++){ ...原创 2022-02-04 19:19:26 · 1239 阅读 · 0 评论 -
力扣 7. 整数反转
题目:思路: 整数反转无非是利用%,/,*三个运算符号进行操作,这边需要注意的是范围,我用了一个多于变量t,用来记录上一个,如果超过范围,那么sum在*10的时候就会溢出,得到的数值就不是原来的数*10了,用这个方法来判断是否超出范围并返回0。代码:class Solution { public int reverse(int x) { int sum=0; while(x!=0){ ...原创 2022-02-03 23:32:14 · 475 阅读 · 0 评论 -
力扣 1414. 和为 K 的最少斐波那契数字数目
题目:分析: 本题采用贪心算法,具体说就是找出小于k中最大的斐波那契数字,然后减去,然后再找,直到k=0。代码:class Solution { public int findMinFibonacciNumbers(int k) { int sum=0; while(k!=0){ k=k-find(k); sum++; } return sum; ...原创 2022-02-03 21:02:57 · 430 阅读 · 0 评论 -
力扣 2000. 反转单词前缀
题目:分析: 首先判断字符串中是否出现ch,无则不变,有则记录位置并开始交换代码:class Solution { public String reversePrefix(String word, char ch) { int i=0; for(;i<word.length();i++){ if(word.charAt(i)==ch){ break; ...原创 2022-02-02 22:18:13 · 645 阅读 · 0 评论 -
力扣 1342. 将数字变成 0 的操作次数
题目:分析: 区分奇偶数即可。代码:class Solution { public int numberOfSteps(int num) { int sum=0; while(num!=0){ if(num%2==1){ sum++;num--; }else{ num=num>>1; ...原创 2022-02-01 01:09:39 · 480 阅读 · 0 评论 -
力扣 884. 两句话中的不常见单词
题目:分析: 找重复,所以我用了hashmap,切割字符串后,遍历两个字符串,然后再hashmap中存入他们所出现的次数,最后遍历一遍key找出次数为1的。代码:class Solution { public String[] uncommonFromSentences(String s1, String s2) { HashMap<String,Integer> hash=new HashMap<String,Integer...原创 2022-01-30 23:30:02 · 1256 阅读 · 0 评论 -
力扣 1765. 地图中的最高点
题目:分析:此题开始点应从水域单元格,也就是初始为1的地方开始向周围扩散,每级+1,又由于水域初始值应为0,所以我们可以一个队列存点,遍历一遍原有数组使他们原本存的数-1,那么水域就成了正确的0,并将它们存入队列,而陆地为-1。之后从队列中选出点向其上下左右在数组范围内的-1点赋值,从1开始一直到最高点。.代码:class Solution { private Queue<int[]> list=new LinkedList<>();...原创 2022-01-30 23:28:22 · 190 阅读 · 0 评论 -
力扣 155. 最小栈
题目:分析: 原本傻傻的自己写了个栈,写完一看题解可以用stack,在下面有个评论说面试时问到怎么不用辅助栈,于是结合思考了一下,自己写了一下代码。 他就是在原有栈存一个int的情况下,扩城int[ ]存放两个元素,一个是val,一个是动态规划下来现有栈的最小值。代码:class MinStack { private Stack<int[]> stack=new Stack<>(); public MinSt...原创 2022-01-27 23:53:07 · 578 阅读 · 0 评论 -
力扣 2047. 句子中的有效单词数
题目:分析: 由于字符串里只存在数字,五种符号和小写字母,我们可以先把句子切割成一个个单词,写一个函数来判断这个单词是否满足条件,不满足有以下几种情况:1、出现数字2、为空3、符号不在最后4、出现2个及以上的-5、-左右没有小写字母这边要说明一下第五点,由于我写的函数,出现数字,符号不在最后一位都会直接返回false,那么这一点需要判断的只有3种情况。1、-在单词第一位。2、-在单词最后一位。3、-在单词倒数第二位且最后一位为符号。代码:...原创 2022-01-27 12:03:29 · 164 阅读 · 0 评论 -
力扣 1688. 比赛中的配对次数
题目:分析: 只需要考虑此时共有奇数支还是偶数支参数队伍即可,二者的区别的%2的余数,而这余数正好是他们是否需要轮空是下一轮选手+1的数。代码:class Solution { public int numberOfMatches(int n) { int sum=0; if(n<=1){ return 0; } while(n!=1){ su...原创 2022-01-25 22:55:27 · 814 阅读 · 0 评论 -
力扣 167. 两数之和 II - 输入有序数组
题目:思路: 这道题我看到时马上联想到的是用哈希,把numbers作为key,数组下标作为value存,遍历时查看是否存在target-当前数组的数字的key即可。但要注意的是,题目要求的是下标以1开始,数组以0开始,所以最后的结果需要+1。代码:class Solution { public int[] twoSum(int[] numbers, int target) { HashMap<Integer,Integer> has...原创 2022-01-24 23:03:36 · 271 阅读 · 0 评论 -
力扣 2034. 股票价格波动
题目:分析: 看到这题首先进行分析,最大最小是去绝对price,最新取决去最大的times,初始化就是一个类的初始化,updata就是放值的过程,所以我们可以为price与times作一个哈希表,用一个int来存最大的times,用一个有序集合来进行最大最小的取值。代码:class StockPrice { int maxTimestamp; HashMap<Integer, Integer> timePriceMap; Tree...原创 2022-01-23 23:51:52 · 275 阅读 · 0 评论 -
力扣 1332. 删除回文子序列
题目:分析: 初看题目,这是简单题???但仔细读了一下题目你会发现这题非常简单,首先他只有a和b,其次他删除的是一个回文子序列,仔细看子序列的定义,你就会发现,这道题最多为2,当s是个回文,返回1,若不是,第一次删除全部的a,第二次把剩下的全部删除即可。代码:class Solution { public int removePalindromeSub(String s) { int n=s.length(); if(n==0)...原创 2022-01-22 22:26:55 · 1190 阅读 · 0 评论 -
力扣 100. 相同的树
题目:分析: 判断树是否相同,可以采用层次遍历,新建两个队列,把非空头结点放入,返回false的条件有3中,1一方有左右子树但另一方没有,2值不相同,3队列的size不同,即两个树的结点数不同代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * ...原创 2022-01-21 22:49:32 · 121 阅读 · 0 评论 -
力扣 94
题目:分析:二叉树的中序遍历就是先输出其左子树,在输出本身,最后输出其右子树。 我们写一个中序遍历的递归,然后在主函数调用即可,只需要注意当root为null的情况即可。 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *...原创 2022-01-21 19:40:42 · 475 阅读 · 0 评论 -
力扣 88. 合并两个有序数组
题目:分析: 两数组是有序的且,第一个数组本身就有n+m的长度,那我们可以直接在num1上进行修改,但从小到大比较可能会存在数被覆盖掉的问题,所以我们可以从大到小进行比较排序。 且这题需要注意一个问题,题目只要求排好序,并没有要求输出。代码:class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int i=m+n-1; ...原创 2022-01-21 19:38:17 · 62 阅读 · 0 评论 -
力扣 83. 删除排序链表中的重复元素
题目:分析: 由于他是有序链表,所以存在重复时二者是相邻的,我们只需要判断其下一个与本身值是否相同,不相等往下遍历,相同删除下一个结点并保持不动,因为可能不止两个结点有一样的值代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(in...原创 2022-01-21 17:28:04 · 176 阅读 · 0 评论 -
力扣 66. 加一
题目:分析: 在原数组的基础上从最后开始向前加1,用一个int 记录进位,如果遍历后还有进位,贼需要开辟一个比原来数组大小大1的新数组并返回,值得注意的是那句int l=t;如果没有它的话,进位会先更新而下面加的就不是原来的进位了。代码:class Solution { public int[] plusOne(int[] digits) { int t=0; for(int i=digits.length-1;i>=0...原创 2022-01-20 21:00:26 · 181 阅读 · 0 评论 -
力扣 1790. 仅执行一次字符串交换能否使两个字符串相等
题目:分析: 根据题目得,回答true的情况有两种,要么字符串相同,要么字符串就两个位置相反。 所以我们一开始可以先判断是否相等与字符串长度不是相等,长度相等的话遍历一下观察是否只有两个位置相反。代码:class Solution { public boolean areAlmostEqual(String s1, String s2) { if(s1.equals(s2)){ return true; ...原创 2022-01-20 20:17:36 · 738 阅读 · 0 评论 -
力扣 58. 最后一个单词的长度
题目:分析: 两个思路,第一个是根据空格切割字符串,然后找最后一个。第二个思路是在原有字符串基础上从最后开始向前遍历,找到非空格后再往前遍历找到空格。代码1:class Solution { public int lengthOfLastWord(String s) { String[] a=s.split(" "); return a[a.length-1].length(); }}代码2:class ...原创 2022-01-19 12:05:43 · 659 阅读 · 0 评论 -
力扣 219. 存在重复元素 II
题目;分析: 这道题需要进行查重判断,于是我果断使用哈希,key为nums的值,value为下标索引,每次我们先判断哈希里有没有这个key,有的话读取上一个的索引来判断两索引之差是否小于等于k代码:class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { HashMap<Integer,Integer> hash=new HashMap&...原创 2022-01-19 10:14:12 · 619 阅读 · 0 评论