算法
qiuxinfa123
这个作者很懒,什么都没留下…
展开
-
LeetCode 122. 买卖股票的最佳时机
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/题目描述:给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。提交第5次才通过。。。解题思路:由于不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票),..原创 2020-08-13 11:43:21 · 105 阅读 · 0 评论 -
最小生成树Kruskal算法实现(Java)
Kruskal算法,通过收集边的方式来形成最小生成树,一开始将每个顶点看成一颗树,那么形成最小生成树就是是森林合并为树的一个过程,每次都选择一条权重最小的边,同样也是贪心算法的体现,但是要避免形成环。这里就提出了两个问题:(1)如何保证每次选择的边的权重都是最小的?(2)如何判断待收集的边,是否会与已经收集的边形成环?对于问题(1):有两种方法,一种是对边的权重进行从小到大的排序,另外一种则是使用最小堆来实现(效率更好)针对问题(2):可以通过并查集来判断...原创 2020-07-22 21:51:51 · 3817 阅读 · 0 评论 -
Prim算法实现最小生成树(Java)
最小生成树包含n个顶点和(n-1)条边,并且边的权重最小。Prim算法的思想是:由一颗小树慢慢长大,首先分为两个顶点集合,最小生成树的顶点集合A,和不在生成树中的顶点集合B,每次从B中找一个顶点v,使其到A中的某个顶点的权重最小,并将v放入A,同时从B删除。以下图为例(图中的数字即为权重),进行简单的说明:步骤如下(以v1为起点):(1)一开始,集合A只有顶点v1,剩下的顶点在集合B中,即A={v1}、B={v2,v3,v4,v5,v6,v7}(2)从B中找一个顶点v...原创 2020-07-22 20:56:06 · 1037 阅读 · 0 评论 -
LeetCode 771 宝石与石头
给定字符串J代表石头中宝石的类型,和字符串S代表你拥有的石头。S中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J中的字母不重复,J和S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。示例 1:输入: J = "aA", S = "aAAbbbb"输出: 3示例 2:输入: J = "z", S = "ZZ"...原创 2020-04-24 15:27:08 · 188 阅读 · 0 评论 -
在排序数组中查找数字(Java实现)
题目:统计一个数字在排序数组中出现的次数。注意,这里指的是升序数组。例如:2,4,6,6,7,25如果查找目标是 6,那么就应该返回2,因为6出现了2次如果查找目标是9,那么就返回0,表示没有出现。因为数组是有序的,而且是升序,那么很容易就想到了二分查找法来解决,但是,正常的二分查找,只是找到了中间的一个,无法确定有多少个,因此有必要对其进行改进。思路:(1)找到目标第一次出...原创 2020-04-23 09:48:51 · 943 阅读 · 0 评论 -
寻找无序数组的第k大元素
问题:给定一个无序数组,找出该无序数组的第k大元素。思路:1.先排序,那么第k个元素自然就是第k大的元素了。2.使用最小堆,先利用前k个元素建立最小堆,再往后比较,如果有比堆顶元素大的,则调整最小堆,最后堆顶元素便是要找的值。先看第一种解法,使用排序的方法,这里快速排序,代码如下: //方法1:先排序,第k个就是第k大元素 public static int findKt...原创 2019-01-04 16:34:06 · 1466 阅读 · 0 评论 -
二叉树的非递归遍历(java版)
二叉树的递归遍历比较简单,这里就不聊了。今天主要聊聊二叉树的非递归遍历,主要借助于“栈”后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历。1. 先看看节点类型: //二叉树的节点类型 private class Node{ int data; //节点值 Node leftChild; //左孩子 Node right...原创 2018-12-07 17:23:29 · 8317 阅读 · 5 评论 -
两个队列模拟栈(java版)
用两个队列实现一个栈的功能入栈:将元素进队列1出栈:判断队列1红元素的个数是否为1,如果等于1,则出队列,否则将队列1中的元素,以此出队列并放入队列2,直到队列1中的元素留下一个,然后队列1出队列,再把,队列2中的元素出队列以此放入队列1中。简单点的说,就是通过队列2作为缓冲,每次取出队尾的元素。代码如下:package test.queue;import java.util....原创 2018-12-06 19:57:01 · 593 阅读 · 0 评论 -
两个栈模拟队列(java版)
栈是一种后进先出的线性表,而队列是先进先出的线性表,通过一个栈可以实现一次反序,所以通过两个栈可以实现顺序存取。思路如下:假设两个栈分别为s1,s2。对s1进行入队,出队时,先推断s2是否为空,如果s2不为空,则直接弹出s2最上面的元素。如果s2为空,则将s1的所有元素出栈放入s2中。实现代码如下:package test.stack;//用两个栈模拟队列:栈可以起到反序的作用,两个栈便...原创 2018-12-06 19:18:43 · 759 阅读 · 0 评论 -
队列的实现(java版)
队列(Queue)是限定只能在一端插入、另一端删除的线性表。允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),没有元素的队列称为“空队列”。队列具有先进先出(FIFO)的特性。下面将介绍队列的两种实现方式:基于数组和基于链表的,其中数组使用的是循环队列的思想,如下图(图片来源于网络,如有侵权,请联系我,谢谢),有一个位置是不存储数据的,这样就能比较简单的区别队列满...原创 2018-11-24 12:54:02 · 165 阅读 · 0 评论 -
栈的实现(java版)
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom)...原创 2018-11-24 11:08:02 · 120 阅读 · 0 评论 -
动态规划之完全背包问题(java实现)
之前写了01背包问题,现在写完全背包问题。和01背包不同的是,完全背包不限定某种物品的件数,可以装0,1,2,...,而01背包只有装与不装的区别。但是思考问题的方式还是一样的,我就其中的最大值。详细代码和注释见下面代码。package backpack;/*f[i][v]:前i件物品放入背包容量为v的背包获得的最大收益f[i][v] = max(f[i - 1][v],f[i - ...原创 2018-11-07 20:34:56 · 2941 阅读 · 3 评论 -
动态规划之0-1背包问题
学习动态规划,一开始一头雾水,看了好多博客,写的都是不太适合自己,这篇博客写得通俗易懂https://blog.csdn.net/dapengbusi/article/details/7463968。其实懂了思想,写代码写起来就比较简单了。在这里写一下个人的理解:通过把问题分解为更小规模的问题,分到最小的时候肯定会有一个边界,然后从边界开始反过来求解。有点类似于递归,不过动态规划是用数组或者其他的...原创 2018-11-07 16:56:48 · 130 阅读 · 0 评论 -
图的常用操作(邻接表,java实现)
之前写过图的邻接矩阵表示及其常用操作https://blog.csdn.net/qiuxinfa123/article/details/83719789,这篇博客主要介绍邻接表的相关操作,包括图的建立、深度优先搜索、广度优先搜索、单源最短路径、多源最短路径、最小生成树的Prim和Kruskal算法。先看下节点类型以及边的类型。 //作为某个点的邻接点的顶点信息 class Node{...原创 2018-11-06 12:23:40 · 4575 阅读 · 1 评论 -
图的操作集(java实现)
本篇博客主要介绍图的建立、遍历、最短路径问题以及最小生成树问题,包含了深度优先搜索、广度优先搜索、Dijkstra算法解决单源最短路径问题、Floyd算法解决多源最短路径问题、Prim算法和Kruskal解决最小生成树问题。(详细的说明一般喜欢嵌入到代码当中)1、先看一下顶点类型//图的顶点类型class Vertex { public char value; //...原创 2018-11-04 20:48:37 · 1898 阅读 · 0 评论 -
java实现最大堆(数组方式)
最大堆、最小堆其实就是优先队列,每次取出的元素都是最大或最小的。本博客主要用数组实现最大堆,最小堆的实现原理也是一样的。当然,也可以用list集合来存储元素,方便很多,不用事先设定容量的大小。但还是想用原生的方式来实现一下。具体的注释已经嵌入到代码当中了。package heap;//利用数组实现最大堆public class MaxHeap { private int[] a; ...原创 2018-11-01 14:36:24 · 1820 阅读 · 0 评论 -
二叉树的java实现
最近在复习数据结构,整理了一下,用java语言来实现一下。其实,思想是不变的,只是每种语言的特性略有不同。本篇博客包括二叉树的插入、遍历、删除以及查找。详细注释已经嵌入到代码当中了。package binarytree;//树的节点类class Node{ //没有用private修饰,方便修改 int data; Node leftChild; Node rightChild...原创 2018-10-31 11:01:52 · 125 阅读 · 0 评论 -
冒泡排序及其改进版(Java)
冒泡排序是比较经典的一种排序,虽然实际工作中不怎么使用,抛开面试和笔试可能要考的不说,对其有所了解是必要的。它的核心思想是:比较相邻的两个数,如果前一个数,比后一个数大,则交换。对于n个数的排序,要经过n-1趟排序,第1趟排序,将最大值放在最终的位置,第2趟将第2大的数放在最终的位置,所以只需要n-1趟排序,就可以对这n个数完成排序(以上均是对升序排序而言,若是降序排序,只需要在比较的...原创 2020-02-27 22:54:20 · 569 阅读 · 0 评论