![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
黑峯
这个作者很懒,什么都没留下…
展开
-
Leetcode 38 Lc外观数列 递归做法
多层循环嵌套, 一定要想到用递归来做, 代码简洁不容易出错class Solution { //层层递进想到递归 public String countAndSay(int n) { if(n==1) //递归第一件事, 递归结束条件 return "1"; String str = countAndSay(n-1); //上一轮的输出是是下一轮的输入 StringBuffer ans = new StringBuf原创 2021-01-24 13:07:12 · 144 阅读 · 0 评论 -
leetcode 28 字符串匹配算法
解题思路这题其实就是字符串匹配算法题, KMP算法其实还可以用, 但是朴素匹配算法在实际的表现中其实也还可以而且容易理解代码class Solution { public int strStr(String haystack, String needle) { int lens = haystack.length(); int lenn = needle.length(); int len = lens-lenn+1; if(lenn=.原创 2021-01-18 13:02:17 · 184 阅读 · 0 评论 -
leetcode242 有效的字母异位词
解题思路一道简单题, 首先想到的是用map去做记录所有出现字母的个数和种类两个数组的map做比对就为正确答案, 确实可行但是超越率只有可怜的5%。class Solution { public boolean isAnagram(String s, String t) { if(s.length()!=t.length()) { System.out.println("false"); return false; } //1、存入两个map Map&l原创 2021-01-13 16:40:50 · 56 阅读 · 0 评论 -
反转数字(考虑溢出情况)
本身题不难, 但是题目限定了考虑溢出的情况1、分解出一个数每个位置上的数2、可以在循环的过程中每次先对先前的数*10, 就可以做到从右向左让这个数慢慢成长3、基于这个条件可以进行判断class Solution { public int reverse(int x) { int ans=0; //遍历的顺序是从右到左 while(x!=0) { int tmp = x%10; //如果当前数>Integer.MAX_VALUE/10, 无论下一个数.原创 2021-01-12 16:12:11 · 200 阅读 · 0 评论 -
LC 三数之和
三数之和数组问题 最常用解法1、双下标2、排序这道题也从这两个角度出发去解决问题, 排序可以帮助去掉重复解。外循环遍历整个数组{如果元素大于0直接退出循环, 大于0的数字相加不可能为0;如果当前元素和上一个元素一样则直接跳过,避免重复解(难点);以当前元素的后一个元素为L;以数组最后一个元素为R;while(L<R){int tmp = 当前元素+L+R;if(tmp==0){得到解;//重复元素跳过重复解(因为始终占有,当前元素,故不必担心 [-1,-1,2]类似解找不原创 2021-01-11 21:26:40 · 128 阅读 · 0 评论 -
leetcode 48 旋转图像 LC
一道典型的LC数组题题目要求原地顺时针旋转90度, 一开始就联想到了矩阵的转置,但是矩阵的转置是沿着对角线交换而非旋转。解法一:但是在纸上演算,发现转置后,沿着矩阵的中线 按列对称交换刚好是旋转90度。个人觉得实现难度小 且能击败100%class Solution { public void rotate(int[][] matrix) { //转置 for (int i = 0; i < matrix.length; i++) { for (int j原创 2021-01-10 17:21:24 · 237 阅读 · 6 评论 -
矩阵原地转置
Oj上刷到过到简单题没有多想直接 新建了一个数组 按列遍历便草草结束了这道题。但很明显,时间复杂度和空间复杂度都偏高后来在leetcode上要求原地就又思考了一遍。/** * 1、只遍历上三角 * 2、沿着对角线交换 */for (int i = 0; i < matrix.length; i++) { for (int j = i; j < matrix[0].length; j++) { if(i!=j) { int temp = matrix[i][j];原创 2021-01-09 21:56:51 · 170 阅读 · 0 评论 -
leetcode 36 有效的数独 击败93%
解题思路傻瓜式做法 空间消耗大 , 但是只需要遍历一遍直接根据数独的三个条件逐一进行判断, 不满足直接return false代码class Solution { public boolean isValidSudoku(char[][] board) { //共9个 Set<Character> set1 = new HashSet<>(); Set<Character> set2 = new HashSet<>(.原创 2021-01-09 21:32:38 · 94 阅读 · 1 评论 -
leetcode 283 移动零
解题思路一道非常经典的入门LC题, 如果有学习过数学结构中的数组, 一定知道如何在数组中最高效的删除一个数这道题就可以把0元素直接删除, 最后剩余的空位填补为0即可。代码class Solution { public void moveZeroes(int[] nums) { int curr = 0; //工作指针 for (int i = 0; i < nums.length; i++) { if(nums[i]!=0) nums[curr++]原创 2021-01-09 15:36:21 · 59 阅读 · 0 评论 -
leetcode66加一
解题思路本来考虑了这个数是不是负数,但是看题目是把数组分割成一个个字符, 所以排除是负数的情况但是如果是负数,可以先转成正数然后-1来做,改一改这题就成了-1?1、需要注意防止最类似999情况,创建一个数组n+1的结果数组2、数组虽然存的是0-9的数字,但是不代表int[] 不能存>=10的数,所以最后一个元素直接+13、从最后一个元素开始判断是否>=10, 两个个位数+1上一位最多只会加1class Solution { public int[] plusOne(int[原创 2021-01-09 15:21:23 · 70 阅读 · 0 评论 -
leetcode350两个数组的交集
解题思路查找相同的元素,其中有一个难点就是会出重复,每次必须要排除掉被重复记录的数组。想到了归并排序的方法,设置两个工作指针,不相同的时候移动数字小的那个数组的指针。排序算法可以直接调封装好的快速排序,代码不麻烦,且时间复杂度可以接收,遇到数字数组问题,不妨想想看排序后可以有什么巧妙的解决办法代码class Solution { public int[] intersect(int[] nums1, int[] nums2) { //必须先排序 Arrays.sort原创 2021-01-09 12:44:19 · 66 阅读 · 0 评论 -
是否存在重复元素
利用set不允许重复出现字符自己写的代码public class 存在重复元素 { public static void main(String[] args) { int[] nums = {3,1,-1}; Set<Integer> set = new HashSet<>(); for (int i = 0; i < nums.length; i++) { set.add(nums[i]); } if(set.size()==nums.le.原创 2021-01-08 16:52:20 · 76 阅读 · 0 评论 -
leetcode旋转数组(有值得回顾的地方)
解题思路暴力法每次旋转1个位置, 旋转k次即为正确答案。旋转的时候也是利用前驱结点来实现的, 前驱结点的更新也借助temp变量, 目前阶段遇到题目不要钻牛角尖, 暴力法能解就暴力法代码class Solution { public void rotate(int[] nums, int k) { int previous; int temp; for (int i = 0; i < k; i++) { previous = nums[nums.lengt原创 2021-01-07 16:04:04 · 90 阅读 · 2 评论 -
leetcode,122数组题
解题思路数组题无非就是双下标1、未持有,价格下降中断则买入2、持有,价格上涨中断则卖出最后一天只卖不买(最后一天的处理感觉代码逻辑冗余,可以尝试更换思路解决最后一天 )代码class Solution { public int maxProfit(int[] prices) { int curr=-1; int money=0; boolean flag=false; // false未持有 , true持有 for (int i = 0; i < .原创 2021-01-07 10:41:57 · 81 阅读 · 0 评论 -
leetcode990并查集问题
并查集并查集,用于判断一对元素之间是否相连,他们之间是否相连是动态添加的,这一类问题叫做动态连通性问题。主要执行的操作是1、合并2、判断是够处于同一个集合中使用哈希表或者数组实现,存储的元素用于表示 当前结点 指向的 根结点,初始化的时候根结点指向自己。合并操作就是把 一个集合的根结点指向另一个集合的根结点,两个元素的根结点一样则代表元素 处于同一个集合之中。这种表示 不相交集合的方法称之为 代表元法,每个结点的根结点作为一个集合的代表元并查集:最常见的使用就是kruskal最小生成树算法。也原创 2021-01-06 19:36:07 · 102 阅读 · 0 评论 -
数组删除重复项
给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。你不需要考虑数组中超出新长度后面的元素。本题是leetcode的初级算法题,作为一个新手,看到题目首先的想法就是使用暴力法,暴力法在做初级题的时候其实还是很推荐的,主要原因是在面试做题,复试做题的时候时间基本不会超时。暴力法解题class Solution { public int removeDuplicates(int[]原创 2021-01-06 13:49:01 · 329 阅读 · 0 评论 -
leetcode 830.较大分组的位置 Java
在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。例如,在字符串 s = “abbxxxxzyy” 中,就含有 “a”, “bb”, “xxxx”, “z” 和 “yy” 这样的一些分组。分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 “xxxx” 分组用区间表示为 [3,6] 。我们称所有包含大于或等于三个连续字符的分组为 较大分组 。找到每一个 较大分组 的区间,按起始位置下标递增顺序排序后,原创 2021-01-06 11:25:14 · 70 阅读 · 0 评论