
算法
算法
没出过地球
这个作者很懒,什么都没留下…
展开
-
算法题-双指针-环型链表
如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。给你一个链表的头节点head,判断链表中是否有环。输入:head=[3,2,0,-4],pos=1。解释:链表中有一个环,其尾部连接到第二个节点。解释:链表中有一个环,其尾部连接到第一个节点。输入:head=[1,2],pos=0。pos为-1或者链表中的一个有效索引。输入:head=[1],pos=-1。解释:链表中没有环。原创 2024-09-02 14:48:57 · 313 阅读 · 0 评论 -
算法题-双指针应用-移动0
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。输入:nums=[-9,-1,0,3,5,12]输入:nums=[0,1,0,3,12]输出:[-9,-1,3,5,12,0]输出:[1,3,12,0,0]输入:nums=[0]原创 2024-09-02 11:07:48 · 275 阅读 · 0 评论 -
算法题-双指针应用-合并两个有序数组
给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。输入:nums1=[1,2,3,0,0,0],m=3,nums2=[2,5,6],n=3。合并结果是[1,2,2,3,5,6],其中斜体加粗标注的为nums1中的元素。输入:nums1=[0],m=0,nums2=[1],n=1。输入:nums1=[1],m=1,nums2=[],n=0。解释:需要合并[1,2,3]和[2,5,6]。输出:[1,2,2,3,5,6]原创 2024-09-01 23:04:16 · 302 阅读 · 0 评论 -
算法题-双指针应用-找出字符串中第一个匹配项的下标
输入:haystack = "leetcode", needle = "leeto"输入:haystack = "sadbutsad", needle = "sad"解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1。输入:haystack = "a", needle = "a"解释:"a" 在 "a" 中出现,所以返回 0。解释:"sad" 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。原创 2024-09-01 11:53:20 · 240 阅读 · 0 评论 -
算法题-双指针应用-字典序最小回文串
对于两个长度相同的字符串a和b,在a和b出现不同的第一个位置,如果该位置上a中对应字母比b中对应字母在字母表中出现顺序更早,则认为a的字典序比b的字典序要小。解释:将"egcfe"变成回文字符串的最小操作次数为1,修改1次得到的字典序最小回文字符串是"efcfe",只需将'g'改为'f'。解释:将"seven"变成回文字符串的最小操作次数为1,修改1次得到的字典序最小回文字符串是"neven"。解释:将"abcd"变成回文字符串的最小操作次数为2,修改2次得到的字典序最小回文字符串是"abba"。原创 2024-08-30 21:19:38 · 337 阅读 · 0 评论 -
算法题-双指针应用-反转字符串
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。输入:s = ["H","a","n","n","a","h"]输入:s = ["h","e","l","l","o"]输出:["h","a","n","n","a","H"]输出:["o","l","l","e","h"]原创 2024-08-30 17:14:06 · 262 阅读 · 0 评论 -
算法题-双指针应用-移除元素
元素的顺序可能发生改变。更改nums数组,使nums的前k个元素包含不等于val的元素。解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。输入:nums = [0,1,2,2,3,0,4,2], val = 2。输出:5, nums = [0,1,4,0,3,_,_,_]输入:nums = [3,2,2,3], val = 3。输出:2, nums = [2,2,_,_]原创 2024-08-30 17:01:19 · 317 阅读 · 0 评论 -
算法题-双指针应用-删除有序数组中的重复项
函数应该返回新的长度 5, 并且原数组。,返回删除后数组的新长度。删除重复出现的元素,使每个元素。的前五个元素被修改为 0。原创 2024-08-30 13:55:46 · 270 阅读 · 0 评论 -
算法题-链表反转
将单链表的链接顺序反转过来。输入:1→2→3→4→5。输出:5→4→3→2→1。原创 2024-08-19 22:42:02 · 267 阅读 · 0 评论 -
给一个正整数,如何判断它是不是2的整数次幂
在Java中,判断一个正整数是否是2的整数次幂,可以通过几种方法来实现。原创 2024-08-04 10:45:00 · 646 阅读 · 0 评论 -
求出两个整数的最大公约数
计算两个整数的最大公约数(Greatest Common Divisor, GCD)时,常用的高效算法是欧几里得算法(Euclidean algorithm)。这个算法的基本思想是:对于两个正整数a和b(假设a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。递归地应用这个过程,直到余数为0,此时被除数就是两数的最大公约数。例如,计算48和18的最大公约数,输出将会是6。方法中,使用了递归的方式来实现欧几里得算法。写一段代码,求出两个整数的最大公约数,要尽量优化算法的性能。原创 2024-08-03 08:45:00 · 2019 阅读 · 0 评论 -
实现一个栈,该栈带有出栈(pop)、入栈(push)、取最小元素(getMin)3个方法。要保证这3个方法的时间复杂度都是O(1)
操作的时间复杂度均为 O(1),我们需要在栈中存储元素的同时,额外维护一个最小值的信息。一个常见的方法是使用两个栈,一个用于存储实际元素(我们称之为。实现一个栈,该栈带有出栈(pop)、入栈(push)、取最小元素(getMin)3个方法。操作会检查两个栈的栈顶元素是否相同(即被移除的元素是否是当前最小值),如果是,则同时从两个栈中移除。类,它使用两个栈来分别维护数据和对应位置的最小值。),另一个用于存储对应位置的最小值(我们称之为。也会进行相应的操作以保持同步,从而确保。操作的时间复杂度为 O(1)。原创 2024-08-01 10:49:00 · 294 阅读 · 0 评论 -
有一个单向链表,链表中有可能出现“环”,判断该链表是否为有环链表
在Java中,检测单向链表中是否存在环的最优化算法之一是“快慢指针”算法(也称为Floyd的乌龟和兔子算法)。如果链表中存在环,那么快指针最终会追上慢指针,它们会在环内的某个位置相遇。方法,该方法接收链表的头节点作为参数,并返回一个布尔值,指示链表中是否存在环。有一个单向链表,链表中有可能出现“环”,写出程序判断该链表是否为有环链表。是链表节点的定义,每个节点包含一个整数值和一个指向下一个节点的指针。方法中,我们创建了两个示例链表,一个包含环,另一个不包含环,以演示。原创 2024-08-01 09:08:43 · 207 阅读 · 0 评论 -
查找算法-二分查找(折半查找)
二分查找(Binary Search)算法是一种在有序数组中查找特定元素的搜索算法。它通过不断将数组分成两半,判断目标值可能存在的区间,从而缩小搜索范围,直到找到目标值或搜索范围为空。二分查找的时间复杂度为O(log n),其中n是数组的长度。原创 2024-07-28 07:15:00 · 348 阅读 · 0 评论 -
查找算法-插值查找
插值查找算法(Interpolation Search)是二分查找算法的一种改进,特别适用于数据分布比较均匀的有序数组。它根据要查找的键值与数组两端值的差异比例来估算查找的中间位置,从而减少了不必要的比较次数,提高了查找效率。以下是插值查找算法的关键知识点和Java实现示例。原创 2024-07-27 10:05:45 · 230 阅读 · 0 评论 -
查找算法-顺序(线性)
顺序查找算法虽然简单,但在处理大量数据时效率较低。在实际应用中,如果数据已经排序,通常会选择更高效的查找算法(如二分查找)来提高查找效率。然而,在数据量较小或数据未排序的情况下,顺序查找仍然是一个可行的选择。原创 2024-07-27 10:04:58 · 526 阅读 · 0 评论 -
递归算法知识点
递归算法是计算机科学中一种重要的算法设计技术,它通过函数自我调用的方式来解决问题。递归算法通常涉及两个关键部分:递归基(递归终止条件)和递归步骤(将问题分解为更小的子问题)。原创 2024-07-27 09:30:00 · 565 阅读 · 0 评论 -
排序-计数排序
计数排序(Counting Sort)是一种非比较型整数排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,它要求输入的数据必须是有确定范围的整数。原创 2024-07-26 10:43:25 · 195 阅读 · 0 评论 -
贪心算法思想
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法并不总是能得到最优解,但它对许多问题能提供很好的近似解,并且由于其实现简单、速度快,在解决许多实际问题时非常有效。原创 2024-07-20 09:30:00 · 1258 阅读 · 0 评论 -
计算机算法思想
计算机算法思想是计算机科学中非常重要的组成部分,它们为解决问题提供了系统的、可重复的方法论。原创 2024-07-18 22:15:43 · 662 阅读 · 0 评论 -
排序-归并排序
归并排序(Merge Sort)是一种分而治之的排序算法。它将数组分成两半,对每半部分递归地应用归并排序,然后将排序好的两半合并在一起。原创 2024-07-16 08:15:00 · 217 阅读 · 0 评论 -
排序-基数排序(桶排序)
基数排序的代码实现通常包括初始化桶、分配元素、收集元素和合并结果等步骤。例如,在Java中,可以使用二维数组来表示桶,并使用循环和条件语句来实现元素的分配和收集。基数排序(radix sort)又称桶排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在排序过程中,我们从最低位开始,依次处理每一位数,将元素分配到对应的桶中,然后再从桶中收集回原数组。以下是一个使用Java编写的基数排序(LSD,最低位优先)的示例代码。方法中测试了基数排序,并打印了排序后的结果。原创 2024-06-19 14:56:08 · 476 阅读 · 0 评论 -
排序-堆排序
堆排序(Heap Sort)是一种基于比较的排序算法,它的主要思想是将待排序的序列构造成一个大顶堆(或小顶堆),此时,整个序列的最大值(或最小值)就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值(或最小值)。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。原创 2024-06-17 11:30:00 · 490 阅读 · 0 评论 -
排序-快速排序
快速排序(Quick Sort)是一种高效的排序算法,由英国计算机科学家霍尔(C. A. R. Hoare)在1960年提出。它的基本思想是:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。原创 2024-06-15 17:43:50 · 540 阅读 · 0 评论 -
排序-希尔排序
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。原创 2024-06-12 08:45:00 · 296 阅读 · 0 评论 -
排序-插入排序
插入排序属于内部排序算法,是对于排序的元素以插入的方式找寻该元素的适当位置,以达到排序的日的。原创 2024-06-08 10:33:38 · 258 阅读 · 0 评论 -
排序-选择排序
选择式排序也属于内部排序算法,是从排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。1.选择排序一共有数组大小-1轮排序;2.每一轮排序又是一个循环,循环的规则3.先假定当前这个数是最小数4.然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标5.当遍历到数组的最后时,就得到本轮最小数和下标6.交换数值7.时间复杂度O(n^2)原创 2024-06-07 23:05:30 · 203 阅读 · 0 评论 -
出现一次的数字
现在有一个整数类型的数组,数组中只有一个元素只出现一次,其余的元素都出现两次及以上。进阶:空间复杂度O(1),时间复杂度O(n)原创 2024-06-06 21:55:10 · 160 阅读 · 0 评论 -
排序-冒泡排序
冒泡排序(Bubble Sorting)的基本思想是通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。i++) {j++) {System.out.println("第"+(i+1)+"趟排序后的数组");原创 2024-06-06 22:31:41 · 185 阅读 · 0 评论