leetcode
maihc1
这个作者很懒,什么都没留下…
展开
-
LeetCode每日一题-2021/07/04-错误的集合
错误的集合–java–排序思路:这道题很简单,就是找出一个序列中少了的一个元素和重复了的一个元素。首先我们先讲解求重复元素的方法,有两种方式。一是将序列从小到大排序,比较当前元素与前一个元素的值来寻找重复元素。二是利用哈希表来寻找重复元素。接着我们讲解寻找缺少元素的方法。求解缺少元素可以利用正常序列的和减去该序列除了重复元素的和。由于重复元素我们已经求过了,所以只需利用n*n+1求出正常序列的和就可。代码:class Solution { public int[] findErrorNum.原创 2021-07-04 15:10:49 · 99 阅读 · 1 评论 -
LeetCode每日一题-2021/07/03-根据字符出现频率排序
代码:class Solution { public String frequencySort(String s) { Map<Character,Integer> map = new HashMap<>(); for( Character ch : s.toCharArray() ){ map.put(ch,map.getOrDefault(ch,0) + 1); } Charac.原创 2021-07-03 22:28:08 · 116 阅读 · 0 评论 -
LeetCode每日一题-2021/07/02-雪糕的最大数量
雪糕的最大数量–java–排序+贪心思路:这道题很明显可以看出来,是一道贪心求解的问题,但前提是先对其进行排序。代码:class Solution { // 贪心法 public int maxIceCream(int[] costs, int coins) { int res = 0; Arrays.sort(costs); for( int i = 0; i < costs.length; ++i ){ .原创 2021-07-02 07:50:38 · 91 阅读 · 0 评论 -
LeetCode每日一题-2021/07/01-传递信息
传递信息–java–递归大概有一个礼拜没有更新题解了,今天百忙之中抽点时间更新一下。思路:这道题,乍一看会觉得不好下手,那是因为你没有理解递归思想的核心。递归思想对于学习算法来说有多重要就不用多说了吧。理解递归的两个要素对于理解递归思想来说是相当重要的,即递归的结束条件和递推方程,每次在使用递归解题时,只需要想到这两条,就会使问题简单许多了。代码:class Solution { // 递归思想 public int numWays(int n, int[][] relation.原创 2021-07-01 19:23:02 · 102 阅读 · 0 评论 -
LeetCode每日一题-2021/06/23-二进制中1的个数
二进制中1的个数–位运算–C++思路:这道题求的是给定数字的二进制中1的个数,容易想到的一种解法是循环遍历整个数字的二进制最后一位,如果该数字是2的倍数,则说明是0,不用将结果+1,如果不是2的倍数,则说明是1,将结果+1,最后将数字右移一位,直到数字的所有二进制位全是0,即数字为0时结束循环。代码:class Solution {public: int hammingWeight(uint32_t n) { int cnt = 0; while( n !.原创 2021-06-23 13:22:38 · 63 阅读 · 0 评论 -
LeetCode每日一题-2021/06/22-字符串的排列
字符串的排列–java–回溯思路:这道题一看就是一道典型的回溯问题,求出给定字符串的所有排列。相对于求所有子集的问题,这道题只需要求出长度为原始字符串长度的子集即可。直接利用dfs模板来做。代码:class Solution { private Set<String> res = new HashSet<>(); public String[] permutation(String s) { List<Character> lis.原创 2021-06-22 22:39:15 · 59 阅读 · 0 评论 -
LeetCode每日一题-2021/06/21-二进制手表
二进制手表–java–枚举法思路:可以枚举所有时刻的时分二进制之和,如果得到的结果与传入参数相等,则该时刻符合题目要求,将其时分的字符串表示加入结果集中,枚举完成之后,返回结果集。代码:class Solution { public List<String> readBinaryWatch(int turnedOn) { List<String> res = new LinkedList<>(); for( int i =.原创 2021-06-21 21:34:59 · 156 阅读 · 2 评论 -
LeetCode每日一题-2021/06/19-串联字符串的最大长度
串联字符串的最大长度–java–BFS思路:这道题可以使用BFS来做,前提是需要知道节点在集合中的位置。代码:```javaclass Solution { public int maxLength(List<String> arr) { // bfs Queue<Map<String,Integer>> queue = new LinkedList<Map<String,Integer>>().原创 2021-06-19 21:41:13 · 93 阅读 · 0 评论 -
LeetCode每日一题-2021/06/16-石子游戏
石子游戏–java–dfs思路:这道题,一看题解就觉得自己像个弱智。呜呜呜~~~。DP解法先放下,只有dfs解法。代码:class Solution { private boolean res; // dfs public boolean stoneGame(int[] piles) { dfs(true,0,piles.length - 1,piles,0); return res; } public vo.原创 2021-06-16 20:50:11 · 66 阅读 · 0 评论 -
LeetCode每日一题-2021/06/15-山脉数组的峰顶索引
山脉数组的封顶索引–java–二分法思路:这道题最容易想到的就是枚举每个数字,而要想将时间复杂度降为O(logN),可以使用二分的思想(利用arr[0] < arr[1] < … arr[i-1] < arr[i] >arr[i+1] > … > arr[arr.length - 1])。二分法其实就是在相对有序的序列中找到目标值,在这道题中其实就是找到那个比左右两个数字都大的数。代码:class Solution { public int pea.原创 2021-06-15 21:25:09 · 1195 阅读 · 1 评论 -
LeetCode每日一题-2021/06/14-猜数字大小
猜数字大小–java–二分法思路:这道题很明显的就可以看出是二分问题,废话不用多说,直接套二分模板。代码:/** * Forward declaration of guess API. * @param num your guess * @return -1 if num is lower than the guess number * 1 if num is higher than the guess number * o.原创 2021-06-14 13:33:00 · 109 阅读 · 0 评论 -
LeetCode每日一题-2021/06/13-第一个错误的版本
第一个错误的版本–java–二分思路:这道题最容易想到的就是从1开始遍历到n,第一次调用提供的API结果为true的数即为答案。然而,顺序遍历有序序列,一般也可以用二分思想来做,并且可以将时间复杂度降为O(logN)。目标是找到第一次调用提供的API结果为true的数,可利用二分思想,首先将 left 指向1,而 right 指向 n ,每次计算 left 和 right 的中间值 mid 对应的API是否为 true ,如果为 true ,则将 mid 赋值给 right ,如果为 false ,将m.原创 2021-06-13 15:07:33 · 94 阅读 · 0 评论 -
LeetCode每日一题-2021/06/11-完全平方数
完全平方数–java–BFS思路:这道题官方题解给的是dp和数学解法,这两天基本被DP搞得心态崩了。这道题我想到的是BFS暴力,也是没谁了。过几天必须专门把DP弄明白了。暴力解法,BFS模板直接用就好,没什么特别难理解的地方。代码:class Solution { public int numSquares(int n) { List<Integer> list = new LinkedList<>(); for( int i =.原创 2021-06-11 22:02:16 · 147 阅读 · 2 评论 -
LeetCode每日一题-2021/06/07-目标和
目标和–java–回溯思路:这道题很容易想到的就是回溯算法,虽然说时间复杂度高,但ac还是没问题的。同样可以用dp来做,这里先挖下个坑,等到复习dp的时候,再将动态规划做法加入。代码:class Solution { public int findTargetSumWays(int[] nums, int target) { return dfs(nums,target,0); } int dfs(int[] nums, int target, i原创 2021-06-07 21:54:47 · 54 阅读 · 0 评论 -
LeetCode每日一题-2021/06/03-连续数组
连续数组–java–前缀和思路:这道题的暴力解法应该是很容易想到的,使用两层循环,很容易求解。但超时是肯定的。比较难想的是第二种解法,使用前缀和+哈希表。这个想法最关键的地方在于想到前缀和主要用于求连续子数组和,能想到这一点就很好做了,只需把0换成-1,然后考虑前缀和值相等的情况即可。class Solution { // public int findMaxLength(int[] nums) { // int max = 0; // for( int.原创 2021-06-04 12:58:37 · 66 阅读 · 0 评论 -
LeetCode每日一题-2020/06/02-连续的子数组和
连续的子数组和–java–前缀和+同余定理思路:这道题最容易想到的是时间复杂度为O(n ^ 2)的暴力法,但只可以通过92个用例,第93个用例无法通过,现在连打表都无法通过了。数论学的好的朋友可能会想到求解这道题的关键,即利用同余定理。同余定理简单解释:(a - b) % c == 0 等价于 a % c == b % c知道这个,这道题就变得非常简单了,(arr[j] - arr[i]) % k == 0 就可以转换为 arr[j] % k == arr[i] % k利用哈希表就可以使用o原创 2021-06-02 21:19:27 · 61 阅读 · 0 评论 -
LeetCode每日一题-2021/05/31-4的幂
4的幂–位运算–C++同样是一道考察位运算的题,该题有多种解法,在这里列出两种:一种是使用四进制来求解,另一种是使用取模3来求解方法一:主要思路:要求一个数是不是4的幂,只需将这个数用4进制表示,看表示结果是不是**1000…**这种形式即可。如果是这种格式,说明该数是4的幂。如果不是这种格式,比如123,说明该数不是4的幂方法二:主要思路:一个数要想是4的幂,首先它必须得是2的幂。所以首先判断该数是否是2的幂,如果不是2的幂,肯定也是不会是4的幂。然后再判断是否是4的幂,有两种情况:1原创 2021-05-31 18:04:58 · 57 阅读 · 0 评论 -
LeetCode每日一题-2021/05/30-二的幂
二的幂思路:这道题还是比较简单的,首先分类讨论,如果一个数是负数或0,那么它肯定不是二的幂。如果一个数是正数,可以先列出它的二进制表示,如果二进制表示只有一个1,那么该数就是二的幂,如果二进制表示没有1或有多个1,则不是二的幂例如:8的二进制表示为1000,只有一个1,所以它是二的幂9的二进制表示为1001,有多个1,所以它不是二的幂代码:class Solution {public: bool isPowerOfTwo(int n) { if( n <=原创 2021-05-30 11:48:34 · 63 阅读 · 0 评论 -
LeetCode每日一题-2021/05/28-汉明距离总和
汉明距离总和–java–位运算这道题很容易想到暴力解法,但就算在暴力解法的前提下加上备忘录,还是会超时,所以应该需要更高效的算法来解决。其实通过观察规律很容易可以得到结论:例如:[4,14,2]二进制形式为:0 1 0 01 1 1 00 0 1 0最终结果为:第一列上0的个数乘第一列上1的个数 + 第二列上0的个数乘第二列上1的个数 + 第三列上0的个数乘第三列上1的个数 + 第四列上0的个数乘第四列上1的个数所以最终结果为 2 * 1 + 1 * 2 + 1 * 2 + 3 * 0原创 2021-05-28 17:35:56 · 88 阅读 · 0 评论 -
LeetCode每日一题-2021/05/27-汉明距离
汉明距离–位运算–C++汉明距离汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。 对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。下面来看这道求汉明距离的题:看题很容易理解,汉明距离其实就是统计两个数的二进制表示有几位不同(也就是求其异或值有几位1),很容易就得到了结果。代码如下:class Solution {public: int hammingDi原创 2021-05-27 19:10:05 · 119 阅读 · 0 评论 -
LeetCode每日一题-2021/05/21-不相交的线
题目如下:在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:nums1[i] == nums2[j]且绘制的直线不与任何其他连线(非水平线)相交。请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。以这种方法绘制线条,并返回可以绘制的最大连线数。仔细读题,会发现一个特别神奇的东西,这道题其实就是最长公共子序列问题换了一种问法,其实换汤不换药,看到这里是不是原创 2021-05-21 15:06:30 · 154 阅读 · 0 评论 -
Leetcode每日一题-2021/05/20-前K个高频单词
Leetcode每日一题-2021/05/20-前K个高频单词前K个高频单词方法一:哈希表+排序思路:首先将字符串的出现次数存储在哈希表中(字符串作key,次数作value),然后根据出现次数将其进行排序(从大到小),如果出现次数一样,则按字典序排序。最后返回排序后的前K个字符。代码如下:class Solution { // 哈希表+排序 public List<String> topKFrequent(String[] words, int k) {原创 2021-05-20 21:21:20 · 62 阅读 · 0 评论 -
LeetCode每日一题-2021/05/19-找出第k大的异或坐标值
找出第k大的异或坐标值–java–动态规划本题是一道考察***异或性质***以及***简单的动态规划思想***的题目本题思路:读题之后,相信很多同学都可以很容易的想到本题的状态转移方程:即dp[i][j] = dp[i - 1][j - 1] ^ dp[i][j - 1] ^ dp[i - 1][j] ^ matrix[i][j];根据状态转移方程可以很容易的求得二维dp数组。由于题目是让求第K大的异或值,只需对所有的异或值进行排序,然后返回第K大的异或值即可。代码实现:class Solut原创 2021-05-19 13:58:09 · 87 阅读 · 0 评论 -
leetCode每日一题-2021/05/18-形成两个异或相等数组的三元组数目
形成两个异或相等数组的三元组数目我是垃圾,第一时间连前缀和都没想到~~~。说说这道题吧,首先想到的思路是三次循环,然后在第三重循环中再套一重循环求a和b的值,判断是ab否相等。时间复杂度为n^4,结果没有任何悬念的超时了。附上代码:class Solution {// 暴力解法public int countTriplets(int[] arr) {int cnt = 0;for( int i = 0; i < arr.length; ++i ){for( int j = i +原创 2021-05-18 17:30:00 · 69 阅读 · 0 评论 -
LeetCode每日一题-2021/05/17-二叉树的堂兄弟节点
二叉树的堂兄弟节点-java(DFS)题目如下:求两个节点是否为堂兄弟节点,只需要两个节点的深度(即depth)相等并且父节点不是同一个即可(为了方便,只需要父节点的值不相等)也就是说满足堂兄弟节点的条件就是:两个节点的深度相等父节点的值不相等主要思路:前序遍历整棵树,维护每个节点的深度和父节点,将x、y的深度和父节点的值保存起来。树的遍历完成后,判断值为x、y的节点是否为堂兄弟节点即可。代码如下:/** * Definition for a binary tree node. *原创 2021-05-17 22:57:42 · 85 阅读 · 0 评论 -
leetcode之奇妙的异或运算
leetcode之奇妙的异或运算开始之前,我们先了解一下异或的概念:这是百度百科上异或的解释,这里精简一下:两数异或,相同为0,不同为1.另外,异或有两个重要的性质:满足交换律一个数异或0还是它本身(在后面会用到这两个性质)leetcode 136这个题较简单,但如果用异或操作,可以不使用额外空间来实现。原理就是:先对数组中所有元素进行异或运算。nums[0] ^ nums[1] ^ … ^ nums[nums.length() - 1]利用上面提到的两个性质:利用交换律原创 2020-12-18 20:19:28 · 464 阅读 · 0 评论