数据结构与算法
文章平均质量分 54
Peihj2021
趁年轻,多学点
展开
-
151. 反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。原创 2022-09-06 09:31:44 · 397 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
通过stringbuilder对字符串进行遍历,如果遍历发现了空格那么就用“%20“;请实现一个函数,把字符串 s 中的每个空格替换成"%20"。原创 2022-09-05 12:32:56 · 139 阅读 · 0 评论 -
leetcode--541. 反转字符串II
题目链接:力扣链接1、因为题目说每隔2k个字符串对前k个字符串进行反转,当最后收尾时候不足k个时,我们可以将其全部进行反转。所以我们开始对字符串进行遍历,直接间隔直接设置为2k即可。2、每一次遍历我们都需要对临界条件进行判断,因为每次都会跳到i+2k的位置,所以我们只需要判断当前位置向后移动k个位置是不是依然再边界条件内就可以了;3、如果再临界条件内,我们对其进行反转即可,这里反转需要重新写一个脚步作为辅助,脚本的逻辑和反转字符串1差不多,我们只需要传入数组,当前的下标,需要反转第k个位置下标就可以了。原创 2022-08-06 11:03:19 · 1281 阅读 · 0 评论 -
leetcode--344. 反转字符串
题目链接: leetcode344编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。思路分析思路1重新开辟一个和给出的数组相同大小的数组,我们通过对给出的数组进行遍历,然后按照逆序将数组进行输出,但是这种方法与题目不符合,题目要求的是原地修改数组。思路2在原数组上进行超做那必然是双指针法提交原创 2022-08-05 10:50:40 · 189 阅读 · 0 评论 -
leetcode18--四数之和
题目链接: leetcode18本题是三数之和的扩展版本,但是与三数之和不同之处在于,本题是指定了目标值,我们拿到题目第一步还是先对题目给定的数组做排序。然后我们通过for循环对开始确定四数之和的第一个数,和三数之和的逻辑相同我们先对于数据进行去重复与剪枝。剪枝后进行三数之和的操作。提交https://leetcode.cn/problems/4sum/submissions/https://programmercarl.com/0018.%E5%9B%9B%E6%95%B0%E4%B9%8B%E5%原创 2022-08-04 13:23:11 · 56 阅读 · 0 评论 -
leetcode15--三数之和
代码】leetcode15--三数之和。原创 2022-07-26 10:52:11 · 89 阅读 · 0 评论 -
leetcode383赎金信
然后我们对randomNote进行遍历,将映射的位置进行减一,最后我们看数组中有没有小于0的数就好了,如果有小于0的数那就证明数组中有其他的元素,那就不对,直接返回false,如果没有小于0的那就返回true。题目中的字母都是小写字符,所以我们考虑使用数组利用哈希算法进行映射,我们将magazine数组进行映射,将其在指定的位置进行加1....原创 2022-07-26 10:46:09 · 147 阅读 · 0 评论 -
leetcode--四数相加II
代码】leetcode--四数相加II。原创 2022-07-23 23:35:51 · 1440 阅读 · 0 评论 -
leetcode1 --两数之和
链接。原创 2022-07-23 22:47:35 · 86 阅读 · 0 评论 -
leetcode202---快乐数
链接。原创 2022-07-23 21:35:18 · 155 阅读 · 0 评论 -
leetcode--两个数组交集2
两个数组的交集2与两个数组的交集1的区别在于交集1不准重复但是交集2可以重复,1、我们选定数组长度较短的一个进行hashmap赋值,如何选择长度较短的一个本题目中用了递归算法保证nums1一直都是最短的。其中k为数值,v为数值出现的次数。2、在nums1用hashmap赋值以后我们还需要对nums2进行遍历,在nums2遍历的过程中我们需要通过nums1的hashmap的value值进行判断nums1中有没有出现这个数值。3、如果hashmap存在那么将数值存储进入数组中,并将相应的hashmap的v原创 2022-07-14 01:03:45 · 107 阅读 · 0 评论 -
leetcode--349. 两个数组的交集
因为是数组求交集,而且数组首先无法确定数值会有多大,所以如果利用哈希函数建立索引是无意义的,其次题目给出的数组是重复的,求得的交集是无序不重复的,所以我们考虑用Java的hashset方法,因为hashset方法底层是数组+链表+红黑树,运行的快,我们对于nums1进行遍历,用hashset进行重写,这样hashset里面全部都是无序不重复的数值,然后我们对于nums2进行遍历,再用一个新的hashset2进行写入,额外多加一个判断语句,并且用nums1的hashset进行判断,如过hashset1里面有这原创 2022-07-14 00:00:50 · 149 阅读 · 0 评论 -
leetcode--49字母异位词分组
1.将不同的字符串转换为字符数组并按照字母顺序进行排序2.异位词排序后的结果相同,故可以作为哈希表的key值3.将字母异位词组成的集合作为哈希表的value值参考https://leetcode.cn/problems/group-anagrams/solution/zi-mu-yi-wei-fen-zu-ha-xi-biao-zhu-bu-zh-gf9q/...原创 2022-07-13 23:01:05 · 85 阅读 · 0 评论 -
leetcode--242. 有效的字母异位词
leetcode略我们利用hashmap的键值对方法,首先我们需要对于传入的两个字符串进行长度比较,如果长度都不一样那么肯定这两个字符串肯定不一样,结果肯定为false;如果长度一样我们需要对其进行遍历,将其中一个字符串的数值以及出现的次数存放于对应的hashmap中,然后我们便利第二个字符串,如果hashmap中出现了字符,那么我们就将对应的字符减一,最后我们看一下hashmap中所有的key对应的value是否全部为0了,全部为0那么就为true,反之为false。数组其实就是一个简单哈希表,而且这道题原创 2022-07-13 21:47:07 · 123 阅读 · 0 评论 -
数据结构与算法---链表反转
链表反转原创 2022-07-13 15:13:22 · 120 阅读 · 0 评论 -
数据结构与算法之双链表
双向链表也叫双向表,是链表的一种,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用来存储数据,其中一个指针域用来指向其后继结点,另一个指针域用来指向前驱结点。链表的头结点的数据域不存储数据,指向前驱结点的指针域值为null,指向后继结点的指针域指向第一个真正存储数据的结点。按照面向对象的思想,我们需要设计一个类,来描述结点这个事物。由于结点是属于链表的,所以我们把结点类作为链表类的一个内部类来实现参考黑马程序员...原创 2022-07-03 11:16:05 · 127 阅读 · 0 评论 -
203. 移除链表元素解法以及在编辑器中如何测试
203. 移除链表元素题目链接:leetcode题目描述java代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { th原创 2022-03-23 10:14:23 · 139 阅读 · 0 评论 -
单链表简介
单链表简介单链表简介现虽然顺序表的查询很快,时间复杂度为O(1),但是增删的效率是比较低的,因为每一次增删操作都伴随着大量的数据元素移动。我们可以使用另外一种存储结构实现线性表,链式存储结构。链表是一种物理存储单元上非连续、非顺序的存储结构,其物理结构不能只管的表示数据元素的逻辑顺序,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列的结点(链表中的每一个元素称为结点)组成,结点可以在运行时动态生成。那我们如何使用链表呢?按照面向对象的思想,我们可以设计一个类,来描述结点这个事物,用一原创 2022-03-22 09:18:00 · 630 阅读 · 0 评论 -
leetcode76--最小覆盖子串
leetcode76–最小覆盖子串题目描述题目链接:leetcode76解题思路–滑动窗口对于本题,首先可以根据题目描述是属于滑动窗口解法,和leetcode的第三题比较像,对于滑动窗口解法,首先我们需要定义左节点,右节点,窗口长度,剩下的就是中间的判别过程了。对于本题,给定了总字符串长度s,以及目标字符串长度t。寻找s中覆盖t的最小子串。如果不存在则返回空字符串,所有这是一道有返回值的题目,返回值类型为String,所以我们定义一个res作为返回值,默认值就为“”。首先我们先遍历一下目标字符串t原创 2022-03-17 16:26:36 · 603 阅读 · 0 评论 -
滑动窗口--leetcode03
题目描述题目链接:03leeetcode给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。解题思路–map集合滑动窗口解法我们采用java中的map集合来对于给定字符串进行遍历,并记录下给定字符串的值以及下标,不断遍历,如果出现了重复数字,通过map集合中带有的键找值功能去找到对应的下标,将窗口的最左边下标进行更新。class Solution { public int lengthOfLongestSubstring(String s) { Map&原创 2022-03-16 10:55:51 · 673 阅读 · 0 评论 -
904. 水果成篮
904. 水果成篮题目描述题目链接:904水果成蓝你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。原创 2022-03-13 16:14:26 · 782 阅读 · 0 评论 -
209.长度最小的子数组
209.长度最小的子数组题目描述题目链接:209给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。输入:target = 4, nums = [1,4,4]原创 2022-03-12 15:59:37 · 195 阅读 · 0 评论 -
844. 比较含退格的字符串
844. 比较含退格的字符串给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。输入:s = "ab#c", t = "ad#c"输出:true解释:s 和 t 都会变成 "ac"。输入:s = "ab##", t = "c#d#"输出:true解释:s 和 t 都会变成 ""。输入:s = "a#c", t = "b"输出:false解释:s 会变成 "c",但 t 仍然原创 2022-03-11 16:54:54 · 248 阅读 · 0 评论 -
977.有序数组的平方
977.有序数组的平方题目描述题目链接:题目链接给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]代码暴力解法,没什么好说的class Solution:原创 2022-03-11 13:24:26 · 209 阅读 · 0 评论 -
283. 移动零
283. 移动零题目描述题目链接:题目链接给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]输入: nums = [0]输出: [0]思路分析在不改变数组非0元素的前提下,我们将0全部转移到数组后面,显然这题是经典的双指针算法,我们取一个快指针一个慢指针,利用一个循环,快指针遍历找到所有的非0元素,并通过慢指针的原创 2022-03-10 16:07:38 · 166 阅读 · 0 评论 -
26. 删除有序数组中的重复项
26. 删除有序数组中的重复项题目描述题目链接:力扣给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(原创 2022-03-10 10:04:58 · 247 阅读 · 0 评论 -
数据结构与算法--27.移除元素
27.移除元素题目描述题目链接:题目链接给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。输入:nums = [3,2,2,3], val = 3输出:2, nums = [2,2]解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的原创 2022-03-09 14:12:26 · 192 阅读 · 0 评论 -
数据结构与算法--367.有效的完全平方数
367.有效的完全平方数题目描述题目链接:题目地址给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如 sqrt 。输入:num = 16输出:true输入:num = 14输出:false思路分析之前我们做过了一些有序不重复数组,找有序数组的下标,查找有序数组的索引位置,找出给定数的平方根的结果,找有效的完全平方数,这些题目的共同解法就是二分算法,二分算法的核心就是要知道两个边原创 2022-03-08 10:57:43 · 191 阅读 · 0 评论 -
数据结构与算法--69.x 的平方根
数据结构与算法–69.x 的平方根题目描述题目链接:x的平方根给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。>案例1:输入:x = 4 输出:2>案例2:输入:x = 8输出:2解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。思路1首先我想到的解法是最为简单粗暴的暴力求解,对于题目而言,首先考虑特殊的取值(0,1,2),排除特殊取值之后我们采用fo原创 2022-03-07 22:05:38 · 508 阅读 · 0 评论 -
数据结构与算法--在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置题目描述给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]输入:nums = [], target = 0输出:[-1,-1]思路分析1、数组有序,判断目标值是否存在于数组中。如果不存在直接输出[-1,原创 2022-03-06 13:48:04 · 339 阅读 · 0 评论 -
数据结构与算法--二分查找
数据结构与算法–二分查找二分查找前提有序数组,数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件。二分查找的边界问题左闭右闭:我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)。区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间。while (left <= right) 要使用 <= ,因为left == right是原创 2022-03-02 19:57:37 · 145 阅读 · 0 评论 -
数据结构与算法---数组
题目描述绘制一个扫雷的游戏,给定三个输入的变量M,N,P绘制一个扫雷的棋盘,要求棋盘中每个单元格中雷的概率为p。思路分析对于扫雷游戏而言,第一步是要绘制出一个棋盘,但是棋盘大小如果按照M*N进行绘制那么需要考虑很多的边界调节,因为我们在考虑扫雷游戏的每个单元格的时候,单元格中如果不为雷那么其中的数字应该是周围雷的个数,一般来说针对于每一个单元格我们需要考虑的无非是上,下,左,右,斜右上,斜右下,斜左上,斜左下。对于棋框内部的仍可以直接用for语句进行遍历但是对于棋框边界的就不容易了,对于次我们考原创 2021-10-31 11:11:13 · 1569 阅读 · 0 评论