
数据结构和算法
祖国の花朵
这个作者很懒,什么都没留下…
展开
-
并查集
1. 概念并查集(Union Find)是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。功能:a. 查找两个元素是否属于同一个集合:isSameSet(A,B) A所在的集合为Set1,B所在的集合为Set2,则返回Set1和Set2是否属于同一个集合;b. 将两个元素各自所在的集合合并到一起class UnionFind { public static class Node{ //whataver yo原创 2021-01-13 17:02:50 · 133 阅读 · 1 评论 -
拓扑排序:深度优先搜索实现(leetcode210课程表)
1. 概念拓扑排序:对于n个节点的有向图G,一个有向边(u, v),那么对节点进行排序后,u在v的前面(如果G中有环存在,那么不能进行拓扑排序)。可以用dfs(栈)和bfs(队列)来实现拓扑排序。dfs具体算法:将所有的点设为三种状态:未搜索0,搜索中1,已完成2。对任意一个未搜索节点0的相邻节点进行搜索,同时把这个节点的状态设为1,1的相邻节点只能是0和2,如果状态为1的节点的相邻节点状态为1,说明有环,返回null。如果没有相邻节点,保存到栈中,把这个节点的状态设为2。2. 代码class S原创 2021-01-13 15:40:45 · 581 阅读 · 0 评论 -
用“埃氏筛法”求2~100以内的质数。
import java.util.ArrayList;import java.util.List;public class Ch4_1_2 { public static void main(String[] args) { System.out.println("100以内的素数如下:"); List<Integer> lists...原创 2019-11-24 15:11:31 · 557 阅读 · 0 评论 -
输入一颗树,打印“双樱桃”的个数。
一道面试题。输入一颗树,打印“双樱桃”的个数。import java.util.*;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); Map<Integer, TreeNode> map原创 2020-09-12 18:00:11 · 229 阅读 · 0 评论 -
团队之间通知传递
某一道笔试题。主要思路是用到一个队列和两个hashset来模拟一个传染的过程。import java.util.*;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); //人数原创 2020-09-14 16:37:50 · 284 阅读 · 2 评论 -
逆时针打印完全二叉树(从根节点逆时针,只打印边界节点)
题目边界节点的定义为:根节点,二叉树左边节点,二叉树右边节点,叶子节点输入n和n个整数,表示节点的个数以及每个节点的层序遍历的数值。输出逆时针遍历的结果,空格隔开代码逆时针的遍历分为四条线。import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext(.原创 2020-08-22 21:17:34 · 619 阅读 · 0 评论 -
贪心---leetcode1405最长快乐字符串
题目代码class Solution { //a个a,b个b,c个c public String longestDiverseString(int a, int b, int c) { List<Entry> list = new ArrayList<>(); list.add(new Entry('a', a)); list.add(new Entry('b', b)); list.add(n.原创 2020-08-20 19:31:19 · 230 阅读 · 0 评论 -
贪心----leetcode1383 最大团队表现值
贪心问题基本都是靠排序和优先级队列。题目代码//最多k个工程师//首先把efficiency按照降序排序,对应的speed也要跟着排序//在speed上维护一个不超过k个元素的小根堆。//当遍历到efficiency[i]的时候,efficiency[i]是遍历过的当前最小的元素//然后把小根堆上的k个数相加和efficiency[i]相乘。class Solution { public int maxPerformance(int n, int[] speed, int[]原创 2020-08-19 11:41:45 · 332 阅读 · 0 评论 -
贪心----leetcode1029两地调度
题目复述:一个二维数组,costs[2N][2],数组的长度是偶数。costs里面有N个元素选择第一个数,另外N个元素选择第二个数。求这2N个数相加得到的最小值。思路:先全部选择第二个数,然后把其中一半改为第一个数,对二维数组进行排序。排序的规则是每一个子数组中第二个数减去第一个数越大的放在前面。class Solution { public int twoCitySchedCost(int[][] costs) { int N_2 = costs.length;原创 2020-08-18 11:33:16 · 263 阅读 · 0 评论 -
lists.add(list)和lists.add(new ArrayList<>(list))的区别
原文:difference on list.add() AND list.add(new ArrayList<>())? //第一种情况:List<List<Integer>> res = new ArrayList<>();List<Integer> row = new ArrayList<>();for (int i = 1; i <= 3; i++) { row.add(i); res.add(row);原创 2020-08-02 11:38:39 · 2691 阅读 · 1 评论 -
负数在内存中的形式
负数在计算机中以补码形式存在。5的二进制原码为0000 0101(省略前面24个0),-5的二进制原码0000 0101(省略最高位1和23个0)-5的反码为原码除最高位(符号位)外取反得到。为1111 1010(前面省略24个1)-5的补码为反码加1,为1111 1011(前面省略24个1)-5 + 5得到0...原创 2020-04-29 12:11:03 · 780 阅读 · 0 评论 -
leetcode周赛----传递信息
class Solution{ /** * * @param n n名玩家 * @param relations 二维关系数组 * @param k k轮传递 * @return */ public int numWays(int n, int[][] relations, int k){ int[][...原创 2020-04-19 00:15:57 · 380 阅读 · 1 评论 -
贪心---抽卡游戏
微众某道笔试题。。排个序就行import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int cards = sc....原创 2020-04-08 20:51:01 · 587 阅读 · 2 评论 -
Java手写简易哈希表
即使是用了哈希表刷了这么多的题,然而真正的手写实现一个哈希表还是可以加深对哈希表的认知。。import java.util.Objects;//Objects类的equals方法是判断两个对象是否相等。 //在比较两个对象的时候,Object.equals方法容易抛出空指针异常。public class MyHashMap<K, V&g...原创 2020-03-22 20:26:53 · 588 阅读 · 0 评论 -
Java实现单链表的合并
首先定义一个节点类:class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } public int getVal(){return val;} public void setVal(int v...原创 2020-01-06 14:35:36 · 1278 阅读 · 0 评论 -
Java实现单链表的反转
单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据。二是指针域,用于存储下一个节点的地址。leetcode中的单链表节点在Java中定义如下:/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode nex...原创 2020-01-06 11:49:53 · 201 阅读 · 0 评论 -
快速排序
算法思想:基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两个指示标志(low指向起始位置,high指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换low和high位置的值,然后从前半部分开始扫秒,发现有元素大于基准点的值,就交换low和high位置的值,如此往复循环,...原创 2019-12-31 14:55:43 · 135 阅读 · 0 评论