数据结构与算法
文章平均质量分 50
玉米子禾
吾生也有涯,而知也无涯。
展开
-
【数据结构与算法】原地交换两个整数值
一般的做法,我们要交换两个整数的值都要定义一个临时变量来存储,那有没有其他的方法可以交换变量的值呢?原创 2022-07-10 05:31:52 · 378 阅读 · 0 评论 -
【数据结构与算法】不同路径 III:使用哈密尔顿路径算法实现
【数据结构与算法】不同路径 III:使用哈密尔顿路径算法实现Java不同路径 IIIhttps://leetcode-cn.com/problems/unique-paths-iii/解题思路使用哈密尔顿路径的方法解决。图的深度优先遍历,在遍历时通过left变量记录所有可走的方块有没有被遍历了,如果发现全部遍历过了,并且是在出口了,那么就认为我们找到了一条哈密尔顿路径,返回1,这样多个遍历路径合并的最终结果就是问题的解。有个比较神奇的地方,就是为啥只使用一次深度优先遍历就能找到所有路径?这应该归原创 2021-11-23 11:52:07 · 378 阅读 · 0 评论 -
【数据结构与算法】狼、羊、菜和农夫过河:使用图的广度优先遍历实现
【数据结构与算法】狼、羊、菜和农夫过河:使用图的广度优先遍历实现Java农夫需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船,而且船比较小。除农夫之外每次只能运一种东西。还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够安全地安排这些东西和他自己过河。解题思路学了图论的广度优先遍历算法后,我们可以使用广度优先遍历的思想来完成这道题。首先定义如何表达农夫、狼、羊、菜在河的哪一边。只有两种状态:在河的一边(假设为东边)在河的另一边(假设为西边)那么恰好原创 2021-11-21 12:05:25 · 3695 阅读 · 0 评论 -
【数据结构与算法】打开转盘锁:使用图的广度优先遍历实现
打开转盘锁:使用图的广度优先遍历实现Javahttps://leetcode-cn.com/problems/open-the-lock/解题思路使用图的广度优先遍历思想来实现,字符串处理得比较慢,可以使用哈希方法转换成对应的整型。再者图比较大,搜索速度受限于广度,可以使用双向广度优先遍历优化(没实现,同学们可以自己尝试)。在求解问题的时候,之前的都是实实在在给出了可以遍历的情况,从而很明显可以看出那个问题是个图论问题,而在这个问题中,并没有很明显的给出图论问题的模型,需要我们自己去建模。在本问原创 2021-11-20 21:52:56 · 409 阅读 · 0 评论 -
【数据结构与算法】爱吃香蕉的珂珂:二分法思想实现
爱吃香蕉的珂珂:二分法思想实现javahttps://leetcode-cn.com/problems/koko-eating-bananas/solution/ai-chi-xiang-jiao-de-ke-ke-er-fen-fa-si-1sqa6/解题思路此题目简单分析得知,吃香蕉的速度越快吃掉所有香蕉所用的时间就越短,组成的关系函数具有单调性(可以理解为是有序的,随着速度的增加所用的总时间是依次减少的),所以可以用二分法的思想来解决问题。那么这样就得获得两个边界,一个是最慢的情况,一个是最快原创 2021-09-09 13:02:49 · 208 阅读 · 0 评论 -
【数据结构与算法】有序数组查找:二分查找算法实现
有序数组查找:二分查找算法实现Javahttps://leetcode-cn.com/problems/binary-search/solution/you-xu-shu-zu-cha-zhao-er-fen-cha-zhao-s-ciza/解题思路这是一个有序数组,里面的元素都是可比较的,那么可以使用时间复杂度较小的二分查找算法。定义l为查找区间最左边元素的索引,r为区间中元素的个数,或者r-1为区间中最右边的索引,具体逻辑如下:首先找到中间的元素m,对比要查找的元素,如果m大了,那么就在[l,m原创 2021-09-02 15:14:08 · 1089 阅读 · 0 评论 -
【数据结构与算法】找出最小的k个数:三路快速排序算法思想实现
找出最小的k个数:三路快速排序算法思想实现Javahttps://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/zui-xiao-de-kge-shu-san-lu-kuai-su-pai-x-5xro/https://leetcode-cn.com/problems/smallest-k-lcci/solution/zui-xiao-kge-shu-san-lu-kuai-su-pai-xu-s-ns7y/解题思路本题类似找原创 2021-09-02 11:25:01 · 277 阅读 · 0 评论 -
【数据结构与算法】第K大的元素:三路快速排序算法思路
第K大的元素:三路快速排序算法思路Javahttps://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/di-kda-de-yuan-su-san-lu-kuai-su-pai-xu-im68n/解题思路这个题可以利用快速排序算法的隔断思想来解,我们快速排序找到的隔断(partition)在接下来的递归中都不再处理了,因此找到的隔断找到后在哪,排完序之后也是在找到的位置的,从而可以判断k与隔断的大小关系来快速得出第原创 2021-09-02 09:21:32 · 166 阅读 · 0 评论 -
【数据结构与算法】颜色分类:三路快速排序算法思想实现
颜色分类:三路快速排序算法思想实现Javahttps://leetcode-cn.com/problems/sort-colors/解题思路恰好三种元素,可以使用三路快速排序算法的思想,实现出来的时间复杂度是为O(n)级别的。首先是把元素区间分为3段,第一段存0,第二段存1,第三段存2。那么这样需要两个变量来指示这三个段的位置,约定:[0,tl) 为0,(tg,nums.length-1] 为2,[tl,i) 为1,[i,tg] 为未处理。那我们就可以写个while循环,[i,tg]未处理元素为空的原创 2021-09-01 22:46:06 · 213 阅读 · 0 评论 -
【数据结构与算法】逆数对问题:归并
逆数对问题:归并Java解题思路有两种方法:一个是使用暴力解法,直接搜索就行,但是这样会导致判题超时,用的时间比较多,是时间复杂度为O(n的平方)的算法。方法名:w1。另外一个是使用归并排序来解决此问题,众所周知,归并排序是把整个数组分成若干个有序数组,再合并有序数组从而完成整个数组的排序的,而在归并排序合并有序数组的时候,我们很容易统计出两个有序数组之间的逆数对有多少个。例如:数组A:{2,3,4},数组B:{1,3,5},合并时比较第一个,A1>B1,所以B1放到新数组中,又因为数组A是原创 2021-08-30 22:38:05 · 196 阅读 · 0 评论 -
【数据结构与算法】反转链表:递归实现
反转链表:递归实现Java解题思路反转链表,类似其他链表的处理过程,我们可以假设函数已经处理好之后的链表了,我们只要处理头结点跟之后链表的关系。头节点的next节点即处理好之后的新链表的尾节点,此时新链表尾节点指向必定为null,需要更改为指向当前的头节点才能完成整个链表的反转,最后再按惯例,把头节点也就是新链表的尾节点的next指向空,这样就完成了整个链表的反转。代码/** * Definition for singly-linked list. * public class ListNo原创 2021-08-30 22:34:43 · 239 阅读 · 0 评论 -
【数据结构与算法】反转链表:非递归实现
反转链表:非递归实现Java解题思路反转链表首先得有三个指针分别指向上一个,当前和下一个,上一个用于标记新链表,当前用于反转,下一个用于标记旧链表,当前反转之后,新旧链表改动,则新链表头指向新链表头cur,cur指向下一个要处理的节点,即next,next指向下一个要处理的节点的下一个,否则修改下一个节点后就丢失了旧链表。大致示意图如下:代码/** * Definition for singly-linked list. * public class ListNode { * in原创 2021-08-30 22:32:24 · 175 阅读 · 0 评论 -
【数据结构与算法】Java链表与递归:移除链表元素
Java链表与递归:移除链表元素Java解题思路两种结题方式,使用虚拟头节点或者不使用。使用虚拟头节点简单易理解,从虚拟头节点开始,一个一个地看下一个元素,是目标元素则改动当前节点next指针跳过一下,并且重新检查下一个节点(存在下两个及以上节点都应该删除的情况),不是目标元素就将下一个节点变为目标节点,直到下一个目标节点为空。最后返回的是虚拟头节点next指向的真实头节点。不使用头节点要分两种状态考虑,一个是头节点就是要删除的目标节点,另外一个是非头节点是要删除的节点,两种处理方式不一样,首先进原创 2021-08-30 22:29:32 · 183 阅读 · 0 评论 -
【算法与数据结构】栈的典型用法之一:括号匹配
栈的典型用法之一:括号匹配Java解题思路栈是一种“先进后出”的数据结构。本例中,栈顶元素反映了在嵌套的层次关系中,最近的需要匹配的元素。所以我的解决方案使用栈,碰到任意左括号时入栈,否则取出栈顶元素,判断当前字符是否与栈顶元素匹配,不匹配则停止循环并返回假,否则全部循环完之后判断栈是否为空(不为空可能存在在最前面只有左括号的情况),是空则返回真,否则返回假。代码class Solution { public boolean isValid(String s) { S原创 2021-08-30 22:27:34 · 164 阅读 · 0 评论 -
【数据结构与算法】括号匹配:栈的底层原理实现
括号匹配:栈的底层原理实现Java解题思路基于数组实现一个能自动扩容的数组(Array)类,类中提供了基本的增删改查等操作和一些快捷方法,后构建栈(Stack)类,栈类使用之前的数组类来完成基础的入栈、出栈等功能。再由此实现本题逻辑。受判题机限制,全放在一个文件中了。代码实现class Solution { private class Array<E> { // 数据数组 private E[] data; // 数组元原创 2021-08-30 22:21:00 · 190 阅读 · 0 评论