数据结构与算法
Kk_Chosen1
这个作者很懒,什么都没留下…
展开
-
Java算法——验证回文串(LeetCode第125题)
问题描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例分析先判断原字符串中每个字符是否是字母或者是数字,使用 Character类中的静态方法isLetterOrDigit(char ch)来判断如果是的则添加到StringBuilder中 然后再使用双指针判断是否为回文串其实可以使用String类中的replaceAll(String regex, String replacement)方原创 2022-05-21 10:13:44 · 544 阅读 · 0 评论 -
Java算法——移动零(LeetCode第283题)
问题描述给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例分析解法一:遍历数组直接将非零元素全部移动到前面来,然后将数组后面补上零解法二:使用快慢指针,慢指针指向已经处理好的非零元素的尾部,快指针指向未处理好的元素的头部。当快指针不断前移并且指向的元素不为0时,将其与慢指针指向的元素交换。然后慢指针前移一位。注意到以下性质:慢指针左边均为非零数 快指针...原创 2022-05-09 20:24:01 · 408 阅读 · 0 评论 -
Java算法——数组中重复的数据(LeetCode第442题)
问题描述给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。示例分析因为题目中规定了nums 的所有整数都在范围 [1, n] 内,因此 nums 的取值范围正好与 nums 的下标[0, n - 1]能相互映射。利用正负号来标识数组元素是否重复,那么每次判断 nums[原创 2022-05-08 16:56:48 · 1791 阅读 · 0 评论 -
Java算法——反转链表(LeetCode第206题)
问题描述给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例分析解法一:使用头插法返回一个新的结果链表,因为头插法产生的链表就是逆序的。因此刚好就是反转过来的链表。解法二:使用双指针,直接将链表中的指针全部改变方向,最终产生的链表就是反转过来的链表。如图:定义一个preNode初始化为null,一个nextNode指向头节点。定义一个tempNode临时节点保存nextNode.next。首先用tempNode保存当前节点的下一个节点,然后将原创 2022-05-07 17:18:30 · 1021 阅读 · 0 评论 -
Java算法——翻转二叉树(LeetCode第226题)
问题描述给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例分析自顶向下递归交换每个结点的左右子树,便可将整棵树交换。代码实现class Solution { public TreeNode invertTree(TreeNode root) { //递归终止条件 if (root == null) return null; //交换当前节点的左右子树 TreeNode tempRoot原创 2022-05-07 15:38:01 · 745 阅读 · 0 评论 -
Java算法——多数元素(LeetCode第169题)
问题描述给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例分析解法一:利用HashMap,遍历输入数组将数组元素作为key,出现次数作为value。遍历完数组之后,将value最大的map的key返回便是最终答案。代码:class Solution { public int majorityElement(int[] nums)原创 2022-05-03 20:00:18 · 775 阅读 · 0 评论 -
Java算法——按奇偶排序数组(LeetCode第905题)
问题描述:给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。返回满足此条件的 任一数组 作为答案。示例:分析:使用一个长度与nums相等的新数组存储排好序的整数。遍历nums,遇到偶数便将其存放进新数组的前面(从0下标开始),遇到奇数便将其存储至新数组后面(从下标nums.length - 1 开始)。判断是偶数还是奇数的方法这里不用除二取余,可以使用位运算。因为偶数的二进制最后一位数字一定是0,而奇数的二进制最后一位数字一定是1。原创 2022-04-28 22:52:15 · 1906 阅读 · 0 评论 -
Java算法——二进制间距(LeetCode第868题)
问题描述给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。示例分析根据题意进行模拟,用last记录下前一个遇到1的位置,当后面再遇到1时计算二者之间的距离并更新last。可使用 位与(&) 来比较二进制最后一位是原创 2022-04-25 10:11:35 · 206 阅读 · 0 评论 -
Java算法——爬楼梯(LeetCode第70题)
问题描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例分析题目中给出,上台阶的方式只有两种,一种为一步跨一阶,一种为一步跨两阶。这里先列出上前4阶台阶的方式:第1阶:只能一步跨一阶(1种方式)第2阶:(1)1阶 + 1阶 (2) 2阶 (2种方式)第3阶:(1)1阶 + 1阶 (2)1阶 + 2阶 (3)2阶 + 1阶 (3种方式)第4阶:(1)1阶 + 1阶 + 1阶 + 1阶 (2)1阶原创 2022-04-19 14:44:13 · 2752 阅读 · 0 评论 -
Java算法——斐波那契数(LeetCode第509题)
问题描述斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。示例分析根据题目要求可以发现从0,1之后,每个数字都可以由前面两项数字之和计算出来。因此这就是一个最简单的动态规划问题,动态规划的递推公式就是Fn=(Fn - 1) + (Fn - 2)。那么可以创建一个动态规划数组,前两项为0和1。从下标2开始每个数组元素的值都是数组前两个元素的和,最后输出数组最大下标的值就是解。代码实现packag原创 2022-04-19 14:19:55 · 441 阅读 · 0 评论 -
Java算法——二进制求和(LeetCode第67题)
问题描述给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。示例分析这里可以直接模拟竖式相加的过程,从两个字符串最后开始遍历。每次相加都是 进位 + 上面的数字 + 下面的数字,因为二进制加法是逢二进一的。因此相加之后当前位的结果应该为:(进位 + 上面的数字 + 下面的数字)% 2。而每次相加产生的进位则可以用(进位 + 上面的数字 + 下面的数字)/ 2 来表示。代码实现 /* 循环遍历两个字符串,循环一直到遍原创 2022-04-16 10:14:20 · 1119 阅读 · 0 评论 -
Java算法——加一(LeetCode第66题)
问题描述给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例分析题目意为给你一个数,你需要将这个数加一然后返回。只不过这个数是以数组的形式给你的,即该数的最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。那么自然就能想到加一操作是从数字的最后一位开始加的,所以从数组的最后一位开始遍历。这里需要考虑几种情况。首先,如果数组最后一位的原创 2022-04-14 16:36:36 · 848 阅读 · 0 评论 -
Java算法——写字符串需要的行数(LeetCode第806题)
问题描述分析该题输入的字符串长度范围是[1,1000],因此该字符串至少会占一行。所以这里可以定一个变量来记录放置字符串的行数,变量初始值设置位1。定义一个静态变量来表示每行的最大宽度即100。遍历出字符串的每个字符将其减去'a'的ASCLL码便是其对应的widths数组的下标,在遍历中将每个字符的width相加起来表示当前行的宽度,如果结果大于100则意味着要换行了。此时记录行数的变量应该加一。换行之后,当前行的宽度也应该重置。代码实现class Solution { pub原创 2022-04-13 20:41:20 · 504 阅读 · 0 评论 -
Java算法——最后一个单词的长度(LeetCode第58题)
问题描述分析题目要求是返回最后一个单词的长度,那么这里这里可以直接从输入字符串的最后一个下标开始遍历。定义一个int变量记录最后一个单词的长度用来返回结果,因为字符串可能是以空格结尾的,所以遍历时只有遇到不是空格的字符时才开始计数。判断字符串中的字符是否是空格可以用Character类提供的静态方法isWhitespace(char c)来判断,当字符是空格时会返回true。当开始计数之后,如果当前遍历到的字符的下一个为空格时应该break退出循环,说明已经遍历完最后一个单词了。另外应当注意,如原创 2022-04-11 16:32:18 · 1027 阅读 · 0 评论 -
Java算法——唯一摩尔斯密码词(LeetCode第804题)
问题描述分析本题的字母都为小写字母组成,要求是要我们返回不同翻译的数量,所以自然而然就想到了使用HashSet。将26的字母对应的莫尔斯电码存储到数组中,然后遍历输入的单词数组依次找出每个单词的每个字母。根据ASCLL码计算出其对应的莫尔斯电码在数组中的下标,将每个单词的各个字母对应的莫尔斯电码拼接在一起就是每个单词的莫尔斯电了。然后将各个单词对应的莫尔斯电码添加到HashSet中,因为HashSet是不能包含重复元素的,所以我们直接返回HashSet的size()就行,非常的方便。代.原创 2022-04-10 10:49:26 · 685 阅读 · 0 评论 -
Java算法——搜索插入位置(LeedCode第35题)
问题描述分析题目要求我们必须使用O(logn)的算法,其实这不就是给我们提示么。看到这个时间复杂度我们自然而然地想到二分查找,若查找到对应的元素则返回对应下标,若没查找到对应的元素应该返回target应该插入的位置。后者我们可以分成两种情况来讨论,第一种:如果target小于最后一趟二分查找nums[mid]的值则返回mid;第二种:如果target大于最后一趟二分查找nums[mid]的值则返回mid + 1。代码实现public int searchInsert(int[] num原创 2022-04-08 10:55:41 · 283 阅读 · 0 评论 -
Java算法——实现strStr()函数(LeetCode第28题)
问题描述:分析:将子串与主串比较,从第一个字符开始逐个比较,如果全部匹配成功则直接返回子串在主串中出现的位置(假设子串的最后一个字符在主串的位置为i,那么主串从第一个字符的下标 0 到 i 的长度length =i+1;而子串在主串出现的位置就为 length - needle.length())。如果出现不匹配的字符,那么主串的下标则回溯到上一次开始匹配的下一个位置,子串的下标则每次回溯到第一个字符的位置重新开始匹配,以此类推。代码实现:class Solution { ..原创 2022-04-03 20:45:03 · 650 阅读 · 0 评论 -
Java算法——移除元素(LeetCode第27题)
问题描述分析双指针,first指针为结果指针,next指针为操作元素指针如果nums[next]不等于val的话就说明这是不需要删除的元素,那么将它赋值给nums[first],然后first与next指针同时向后移动如果nums[next]等于val则next向后移动,first原地不动最终next将完整遍历一遍数组,将first返回便是移除指定元素后剩下的元素长度代码实现class Solution { public int removeElement(int原创 2022-04-03 20:28:10 · 997 阅读 · 0 评论 -
Java算法——最小的k个数(剑指Offer第40道题)
问题描述分析这题可以先把输入的数组排序称为升序的状态,然后返回数组里面的前k项即可可以直接用Arrays.sort对数组进行排序,但是这样会不会太简单了哈哈哈所以咱们手写快速排序进行排序代码实现 /* 先利用快速排序将输入的数组排成有序数组 然后再前k个元素复制给result数组返回 */ public static int[] getLeastNumbers(int[] arr, int k) { int[] sort原创 2022-04-02 22:11:26 · 456 阅读 · 0 评论 -
Java算法——删除有序数组中的重复项(LeetCode第26题)
问题描述分析此题可用双指针的方法来解题,定义一个pre指针和next指针,初始时两个指针指向数组下标1的位置。因为无论给出的数组是什么样子的,删除重复元素之后其返回结果第一个元素都是不变的。使用next指针循环遍历nums数组,如果nums[next - 1] != nums[next] 则说明这前后两个元素是不重复的,这时就将nums[next]赋值给nums[pre],然后pre再自增1。最终结束循环之后,所有的不重复元素将集中在数组的前面,pre指向的位置就是所有不重复元素的后一个位置原创 2022-04-02 12:07:57 · 1052 阅读 · 0 评论 -
Java算法——有效的括号(LeetCode第20题)
问题描述:分析:首先可以肯定的是当输入的字符串为null或者是字符串的长度为奇数的时候可以直接返回false。这道题目应当用栈这种数据结构来解答,遍历输入的字符串每当遇到左边的括号就将其进栈,每当遇到右边的括号就将栈顶元素出栈。如果出栈的元素不是对应的左括号则直接返回false。最后当栈中没有括号元素时返回true。此外,为了避免没有任何元素进栈导致的空栈报错,我们可以先push一个字符进去放在栈底,最后遍历完只剩下最开始push进去的那个字符则返true。代码实现:class Solutio原创 2022-03-31 20:30:28 · 1098 阅读 · 0 评论 -
java算法——盛最多水的容器(LeetCode第11题)
问题描述给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。分析解法一:暴力破解这一题其实就是计算垂线所围成的最大面积,设面积为A。则A=width 乘以 短垂线的长度,那么我们直接双重for循环把每一种组合的面积计算出来,然后记录最大值并且返回。代码实现c.原创 2022-03-27 14:24:43 · 905 阅读 · 0 评论 -
Java算法——整数转罗马数字(LeetCode第12题)
题目描述给定一个整数,将其转换成罗马数字。例如, 罗马数字 2 写做II,即为两个并列的 1 。12 写做XII,即为X+II。 27写做XXVII, 即为XX+V+II。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做IIII,而是IV。 数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。 同样地,数字 9 表示为IX。这个特殊的规则只适用于以下六种情况:I可以放在 V(5) 和 X(10) 的左边,来表示 4 和 9。X可以放原创 2022-03-26 12:14:14 · 423 阅读 · 0 评论 -
Java算法——两数之和(LeetCode第一题 典中典)
问题描述给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。 但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。分析直接双重for循环暴力破解,使数组每一个元素与其他元素相加如果与target相等直接返回一个下标组成的新数组public static int[] sum(int[] nums, int target) { for (int i =原创 2022-03-25 21:45:38 · 554 阅读 · 0 评论 -
Java算法——罗马数字转换成整数(LeetCode第13题)
给定一个罗马数字,将其转换成整数 例如, 罗马数字 2 写做II,即为两个并列的 1 。12 写做XII,即为X+II。 27写做XXVII, 即为XX+V+II。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做IIII,而是IV。 数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。 同样地,数字 9 表示为IX。这个特殊的规则只适用于以下六种情况: I可以放在 V(5) 和 X(10) 的左边,来表示 4 和 9。 X可以放在 L(50)原创 2022-03-25 21:25:59 · 360 阅读 · 0 评论