![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
力扣刷题
初遇见
在你选择的道路上,坚持走下去,时间总会给你答案
展开
-
JAVA-矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。请使用 原地 算法。1、定义两个布尔数组标记二维数组中行和列0出现的位置,标记在布尔数组中。2、在遍历二维数组,把行和列0出现的位置都重置为0.找到0的位置,把0出现的数组的其他值夜置为0。原创 2024-06-28 18:34:31 · 233 阅读 · 0 评论 -
JAVA-LeetCode 热题-第24题:两两交换链表中的节点
定义三个指针,其中一个临时指针,进行交换两个节点的值,重新给临时指针赋值,移动链表。原创 2024-06-07 14:29:41 · 269 阅读 · 0 评论 -
JAVA-LeetCode 热题 100 第56.合并区间
【代码】LeetCode 热题 100 第56.合并区间。原创 2024-06-06 18:12:19 · 246 阅读 · 0 评论 -
JAVA-计算某字符出现次数
题目写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)数据范围: 1 \le n \le 1000 \1≤n≤1000输入描述:第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字符。输出描述:输出输入字符串中含有该字符的个数。(不区分大小写字母)示例1输入:ABCabcA输出:2思路:把输入的字符都转换成小写,把第二个字符出现在第一个字符替换成"",出现的次数 = 完整字符串的长度-单个字符原创 2022-05-31 20:30:36 · 824 阅读 · 0 评论 -
Java-字符串最后一个单词的长度
题目:计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)输入描述:输入一行,代表要计算的字符串,非空,长度小于5000。输出描述:输出一个整数,表示输入字符串最后一个单词的长度。示例1输入:hello nowcoder复制输出:8复制说明:最后一个单词为nowcoder,长度为8 思路:定义指向字符串最后一个字符的指针,从后往前遍历,遇到空格结束。import java.util.*;public class Ma原创 2022-05-31 20:10:37 · 1164 阅读 · 0 评论 -
Java-判断是否是回文字符串
题目:给定一个长度为 n 的字符串,请编写一个函数判断该字符串是否回文。如果是回文请返回true,否则返回false。字符串回文指该字符串正序与其逆序逐字符一致。数据范围:0 < n \le 10000000<n≤1000000要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)示例1输入:"absba"复制返回值:true思路:用双指针一个指向字符串的第一个元素的指针i,另一个指针指向字符串的最后一个元素指针j,然后判断两个指针的值是否相同,如果相同i++原创 2022-05-31 19:57:56 · 4123 阅读 · 0 评论 -
爬楼梯 - JAVA
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?思路:思路是动态规划1) 爬n-1阶楼梯的方法数量,在爬1阶就可以到第n阶2) 爬n-2 阶楼梯的方法数量,在爬2阶就可以到第n阶可以得到公式F[n] = F[n-1] + F[n-2]初始化 F[0] = 1,F[1] = 1动态规划:1) 状态转移方程2) 条件边界3) 建立转态转移方程注意:给定 n 是一个正整数。class Solution {原创 2021-09-11 21:42:11 · 199 阅读 · 0 评论 -
买股票的最好时机-java
题目描述假设你有一个数组,其中第\ i i 个元素是股票在第\ i i 天的价格。你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。思路-双指针用到的做法是双指针,定义一个min用来表示第一天买入的价格,然后在定义一个变量maxPro表示最大利润,for循环遍历数组,然后看哪天是买入的最小的,然后求最小,maxPro最大林润=卖出-买入,然后和最大利润比看那个最大,最后返回这个maxPro思路就是这样的.public class Solu原创 2021-07-27 19:29:40 · 70 阅读 · 0 评论 -
167. 两数之和 II - 输入有序数组-java
题目描述思路1)哈希这个思路是在上一道题两数之和的基础上进行改的,这道题和两数之和的区别在于这道题的索引是从1开始的,索引返回的值要把索引+12)双指针题目给的是有序数组,索引可以用双指针的做法。定义两个指针一个指向数组的第一个,一个指向数组的最后一个,然后定义一个sum,表示数组中i,j指针对应数的和,然后比较sum和目标值target的大小,如果sum大于目标值就移动j指针,如果sum小于目标值就移动i指针,还有一个情况就是相等,直接返回索引但是要记得i,j指针分别+1class原创 2021-07-27 15:07:28 · 56 阅读 · 0 评论 -
最长无重复子数组-java
题目描述给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组。思路-队列返回递增的连续数组,思路是用队列,队列的特点是先进先出,遍历数组,看队列中是否含有,如果含有说明重复就移除,如果没有就填到到队列,然后返回队列中栈元素数组的最大。public class Solution { /** * * @param arr原创 2021-07-19 20:58:07 · 587 阅读 · 0 评论 -
合并两个有序的数组-java
题目描述思路-双指针用到的思路是双指针,这个题目要求不定义别的存储结构直接原地算在定义一个新的指针作为合并后数组的指针k因为这两个数字都是有序的,所以对i,j指针进行比较谁大谁放在k指针的位置,循环的条件是i指针大于-并且j指针大于0,然后还要考虑一种情况是j指针如果没有遍历完就把剩下的拷贝到A数组中.public class Solution { public void merge(int A[], int m, int B[], int n) { int i原创 2021-07-18 22:19:19 · 78 阅读 · 0 评论 -
java 剑指offer65-不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。输入: a = 1, b = 1输出: 2思路-位运算不进位的运算和位运算中的异或规律一样,异或相同为0不同为1。进位的运算和与运算规律一样,与运算相同为1不同为0。求两个数的和转换成非进位的+进位的,循环求进位和非进位,直到进位为0.class Solution { public int add(int a, int b) { while(b != 0) {原创 2021-07-04 20:23:12 · 57 阅读 · 0 评论 -
力扣977-有序数组的平方(双指针)-java
题目描述给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。题意:把数组中的数平方后在递增排序思路:双指针需要考虑的是数组中负数平方后可能会比正数大,数组平方后最大值会在数组的两端,不是左边就是右边,不可能在中间,因为数组是递增的,思路是用双指针做法,i指向起始的位置j指向数组的最后一个元素的位置,然后在定义一个新的数组result,长度和nums一样,然后用last指针指向result数组的终止位置。如果开头数的平方小于末尾数的平原创 2021-06-11 23:00:13 · 1109 阅读 · 0 评论 -
力扣-27移除元素-java
题目描述给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。思路-双指针题意:在数组中删除等于val的元素。右指针指向当前要处理的元素,左指针指向下一个要赋值的位置,如果右指针指向的元素不等一目标值就把右指针指向的元素复制到左指针的位置,然后左右指针同时右移,如果右指针指向的元素等于目标值,左原创 2021-06-07 22:37:50 · 148 阅读 · 0 评论 -
力扣-704二分查找-java
题目描述给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。思路:二分法这道题的数组是有序的数组,然后题目中也说明是升序的没有重复元素。二分会涉及到边界问题,所以先对区间进行划分,用左闭右闭的。[left,right],while (left <= right) 要使用 <=。第一行是下标第二行是元素的值。我们要在数组中查找元素3。中间值大于目标值,右指针=中原创 2021-06-06 23:01:57 · 157 阅读 · 2 评论 -
力扣-阶乘尾0-java
题目描述设计一个算法,算出 n 阶乘有多少个尾随零。思路:求有多少个尾随0,就是求多个位数为5的,因为2*5=10,2的倍数乘5都尾随0,求尾数为0的数字,就可以相当于求可以整除5的,遍历一遍,每次遇到可以整除5的就+1。class Solution { public int trailingZeroes(int n) { int ans = 0;//初始化ans用来存储0的个数 while(n >= 5){//从5开始遍历 n原创 2021-05-28 21:30:30 · 86 阅读 · 0 评论 -
力扣java-魔术索引-java
题目描述魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。思路输出对应索引值的值,如果有多个就返回索引值最小的一个,思路是挨个进行遍历如果目标值=索引值,就返回索引值最小的一个。class Solution { public int findMagicIndex(int[] nums) { in原创 2021-05-24 23:02:47 · 117 阅读 · 0 评论 -
力扣-整数反转-java
题目描述给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。思路是我们拿到整数的末尾数字用12345为例,先拿到5,在拿到4,在拿到3 ,在拿到2,在拿到1,按照这样的顺序就可以反向拼接一个数字了,也可以达到反转的效果,如何拿到末尾数字,用取模运算12345 % 10 = 5,1234 % 10 = 4,以此类推.进行循环但是要考虑负数,所以循环的条件写成 while( x原创 2021-05-23 22:06:49 · 170 阅读 · 0 评论 -
力扣-链表相交-java
题目描述给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。思路这道题是判断两个链表有没有交点,如果有返回交点,如果没有返回null,题的交点是这个节点即在A链表上又在B链表上,说明这A和B是相交的,如果两个链表是相交的,这两个链表的结构是因为链表A和链表B相交于D的话,说明节点D在链表A上也在链表B上,而D之后的元素自然也是均在A和B上了,原创 2021-05-22 20:54:53 · 252 阅读 · 0 评论 -
力扣-检查平衡性-java
题目描述实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。思路判断二叉树是否是平衡二叉树以及左子树和右子树的高度差不超过1class Solution { public boolean isBalanced(TreeNode root) { if(root == null) return true; //分别计算左子树和右子树的高度 int left = depth(root.lef原创 2021-05-21 22:47:38 · 100 阅读 · 0 评论 -
力扣java-返回倒数第k个节点
题目描述实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。思路:双指针第一个指针先走k步,然后第二个指针在从头走,这个时候两个指针同时移动。当第一个指针移动到末尾的时候,返回第二个指针就可以了,第二个指针指向的值就是我们找的倒数第k个结点。class Solution { public int kthToLast(ListNode head, int k) { ListNode first = head;//初始化first指针指向头结点原创 2021-05-16 12:25:30 · 121 阅读 · 0 评论 -
力扣-移除重复节点-java
题目描述编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。思路:用set集合set集合的特点是去重,从链表的头开始遍历,如果在set集合中出现了重复的元素,我们就把他跳过。class Solution { public ListNode removeDuplicateNodes(ListNode head) { Set<Integer> set = new HashSet<>();//定义set集合 ListNode原创 2021-05-13 22:11:58 · 88 阅读 · 0 评论 -
力扣-字符串轮播-java
题目描述字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。思路:先判断长度是否相同,不相同返回false,长度相等的时候,s2是s1旋转而成的,那么把s2和自身拼接一次,s1就会出现在其中,“erbottlewat” + “erbottlewat” = erbottle waterbottle wat,如果s2不是s1旋转而成的,那么那么把s2和自身拼接一次,s1就肯定不会出现在其中。class Sol原创 2021-05-12 22:15:23 · 86 阅读 · 0 评论 -
力扣-字符串压缩-java
题目描述字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。思路:第一种做法-双指针定义两个指针i和j,j指针用来计字符出现的次数。先移动j指针,遇到和i相同的字符j指针就向右自增。遇到不同字符就把j指针的值赋值给i,返回ij指针,a3。然后按照这个方法继续遍历,最后返回的结果是a3b2c3。class S原创 2021-05-11 22:20:54 · 256 阅读 · 2 评论 -
力扣-判定是否互为字符重排-java
题目描述给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。思路做法是先检查这两个字符串的长度是否一致,如果不一致说明这两个 字符串是不可能相等的直接返回false。如果长度相同,假设出现字符的编码之在0-255之间,因为二进制的值是在0-255,我们可以先定义一个长度为256的数组命名为map,map[a]=[b]代表字符编码为a字符出现了的b次,初始时map[0…256]值都是0,遍历字符串str1,每次统计字符出现的数量,比如遍历到字符‘a原创 2021-05-08 22:13:12 · 183 阅读 · 0 评论 -
力扣-判定字符是否唯一-java
题目描述思路:数组因为英文字母的大小是小于128的,我们可以使用一个长度为128的数组来解决,我们用这个数组来存储英文,然后遍历数组,如果不是0,说明数组中含有字符不止一个,返回false,否则遍历下一个元素。class Solution { public boolean isUnique(String astr) { //定义带字符的数组长度为英文字母的总数 int arr[] = new int[128]; //循环遍历数组原创 2021-05-07 20:59:40 · 102 阅读 · 0 评论 -
力扣-最后一个单词的长度-java
题目描述给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。思路:一共两种情况:第一种情况是字符串的末尾没有空格,第二种情况是字符串的末尾有空格1)情况1:字符串“hello word”为例,从后向前遍历直到遍历到头或遇到空格为止,为最后一个单词的长度。2)情况2:用字符串“hello word ”为例,先将末尾的空格过滤掉从后向前遍历直到遍历到头或遇原创 2021-05-06 20:38:42 · 119 阅读 · 0 评论 -
力扣283.移动零-java
题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。思路:我们可以用快排的思想,选择一个待分割的元素作为中点,然后把所有小于等于0的元素放到0的左边,大于0的元素放到其右边。我们用两个指针i,j,只要nums[i] != 0,我们就交换nums[i]和nums[j]。class Solution {原创 2021-04-06 22:05:20 · 101 阅读 · 0 评论 -
力扣121-买卖股票的最佳时机-java
题目描述给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。思路 – 贪心算法思路是设置两个参数,一个是获得到的最大利润maxPro,一个是最小的价格minpro,在遍历数组的过程中,如果价格比最小的价格要小,就更新最小价格,否则我们就比较最大利润和价原创 2021-04-05 22:17:24 · 183 阅读 · 0 评论 -
力扣151-反转字符里的单词-java
题目描述给定一个字符串,逐个翻转字符串中的每个单词。说明:无空格字符构成一个 单词 。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。题意:如果输入的字符前后有空格,反转后不可以前后有空格,如果两个单词的中间有多余的空格,反转后只能有一个,反转的是每个单词。思路:如果把两端空格去掉?trim()方法trim() 方法用于删除字符串的头尾空白符。如何反转每个单词?用双指针i指针的作用是找到第一个循原创 2021-03-25 20:05:32 · 171 阅读 · 0 评论 -
力扣521.反转字符串II-java
题目描述给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。提示:该字符串只包含小写英文字母。给定字符串的长度和 k 在 [1, 10000] 范围内。题意:每隔 2k 个字符的前 k 个字符进行反转,如果剩余字符少于 k 个,则将剩余字符全部反转。的意思是每隔K个反转K个,末尾不够k个的时候全部反转。思路原创 2021-03-24 21:01:14 · 97 阅读 · 0 评论 -
力扣344-反转字符串-java
题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。做法-双指针相当于是把字符数组中的第一个元素和最后一个元素交换,然后第二个元素和倒数第二个元素交换以此类推,就完成了字符串的反转。我们定义两个指针一个指针指向字符数组的第一个元素,另一个指针指向字符数组的最后一个元素,然后两个指针交换彼原创 2021-03-23 10:32:35 · 189 阅读 · 0 评论 -
力扣18-四数之和-java
题目描述给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。题意:这道题是求四个数的和相加等于目标值,然后要把重复的值去掉。这个题的思路和力扣15-三数之和的思路类似,三数之和是固定一个数,其余进行双指针。四数之和是固定两个数,其余进行双指针。排序后如图所示,然后用i,j来固定两个数原创 2021-03-21 14:04:34 · 292 阅读 · 0 评论 -
力扣 - 15 三数之和 - java
题目描述给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。题意:这道题的意思是找到数组中的三个数让他们的和加起来等于0的所有情况,要去掉重复的解。思路- 双指针 + 排序首先需要特判一下,如果数组为null 或数组长度小于3就返回集合。(因为这道题是求三个数的和)对数组进行排序。升序遍历排序后的数组定义两个指针,左指针 l = i +原创 2021-03-20 16:41:14 · 179 阅读 · 0 评论 -
力扣-349两个数组的交集-java
题目描述做法1思路第一步:先初始化两个Set集合,Set集合的特点是里面的元素是无序的,不能根据索引操作,然后里面不可以有重复元素,这样就帮我们把重复的相同元素去掉了第二步:把数组1中的所有元素添加到集合Set1中,然后在遍历数组2 nums2第三步: 判断集合Set1中是否存在nums2中的元素第四步:如果存在就把他们单独的放在另一个set2集合中,set2中存放的就是num1数组中和nums2数组的交集第五步:在这个set2集合转为数组然后返回结果。class Solution原创 2021-03-14 21:36:19 · 142 阅读 · 0 评论 -
力扣242.有效的字母异位词-java
题目描述给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。第一种做法 -排序t 是否是 s 的字母异位词–>两个字符串排序后相等我们把字符串s和t分被排序,然后看排序后的字符串是否相等就可以判断如果s和t的长度不相同,说明t一定不是s的异位词。class Solution { public boolean isAnagram(String s, String t) { if(s.length() != t.length()) retu原创 2021-03-12 21:46:35 · 131 阅读 · 0 评论 -
力扣 第1题,两数之和-java
题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。做法暴力法两层for循环双层的for循环,枚举数组中的每一个数,看数组中是否存在目标值减去第一数的值,然后题意是每个元素不能使用两次,所以我们第二层的for循环就只需要枚举第一个数之后的元素中找就可以。class Solution { public int[] twoS原创 2021-03-11 22:09:30 · 130 阅读 · 0 评论 -
判断链表中是否有环
题目描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。思路双指针做法 --快慢指针快指针fast,慢指针slow快指针fast每次走2步,慢指针一次走一步如果fast 和slow指针在途中相遇说明这个链表有环为什么fast指针走两个节点,slow走一个节点,有环的话一定会在环内相遇?fast走两步,slow走一步。继续循环fast走两步到了环的位置,接着执行,fast指针和slow指针相遇了。public class Solution { p原创 2021-03-09 21:58:04 · 253 阅读 · 0 评论 -
力扣206反转链表-java
【题目描述】反转一个单链表。第一种做法 双指针只需要改变next指针的指向就可以反转链表定义两个指针一个pre,curpre 指向当前结点的前一个节点cur 指向当前结点的后一个节点每次让cur指针的next指向pre,实现一次反转pre 和 cur 同时向前移动一个位置最后 cur 指向 null 循环结束返回 pre ,pre指向了新的头结点这里的next指针相当于 cur定义两个指针pre和next都指向null,然后就要开始反转了.让cur节点指向下一个结点,将原创 2021-03-08 13:47:40 · 195 阅读 · 0 评论 -
力扣203移除链表元素-java
题目描述删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5【链表】链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域,指针域存放的是指向下一个节点的指针,最后一个节点的指针域指向null。链表如何删除结点?只需要将第一个4节点的next指针,指向下一个6节点就可以了。我们需要考虑一个特殊情况就是如原创 2021-03-05 22:20:40 · 185 阅读 · 0 评论