数据结构笔记

1. min/max heap

看到K神马的基本上就是min/max heap.

(1) Find the K closest points to the origin in a 2D plane, given an array containing N points.

 1     public static List<Point> findKClosest(Point[] p, int k) {
 2
 3         List<Point> res = new ArrayList<Point>();
 4         Comparator<Point> comparator = new Comparator<Point>(){
 5             //@Override
 6             public int compare(Point a, Point b) {
 7                 return (int) ( a.x*a.x + a.y*a.y- b.x*b.x -b.y*b.y);
 8             }
 9         };
10
11         PriorityQueue<Point> minheap = new PriorityQueue<Point>(comparator);
12         for (Point temp : p) {
13             minheap.add(temp);
14         }
15         for (int i = 0; i < k; i++) {
16             res.add(minheap.poll());
17         }
18
19         return res;
20     }

version1

如果只能用k个位置保留在有线队列里面的话,那么前k个可以直接加入,后面k个的话,如果比最后一个小,那么把最后1个移除,然后放入当前的点.

 1 public List<Point> findKClosest(Point[] p, int k) {
 2     PriorityQueue<Point> pq = new PriorityQueue<>(10, new Comparator<Point>() {
 3         @Override
 4         public int compare(Point a, Point b) {
 5             return (b.x * b.x + b.y * b.y) - (a.x * a.x + a.y * a.y);
 6         }
 7     });
 8
 9     for (int i = 0; i < p.length; i++) {
10         if (i < k)
11             pq.offer(p[i]);
12         else {
13             Point tmp = pq.peek();
14             if ((p[i].x * p[i].x + p[i].y * p[i].y) - (tmp.x * tmp.x + tmp.y * tmp.y) < 0) {
15                 pq.poll();
16                 pq.offer(p[i]);
17             }
18         }
19     }
20
21     List<Point> x = new ArrayList<>();
22     while (!pq.isEmpty())
23         x.add(pq.poll());
24
25     return x;
26 }  

version2

------------------------我是分割线----------------------------------------

2. 队列 queue

支持操作 o(1) push, o(1) pop, o(1) top

BFS的主要数据结构 多做做bfs题就好了

------------------------我是分割线----------------------------------------

3. 栈 stack

支持操作 o(1) push, o(1) pop, o(1) top

非递归实现dfs的重要数据结构

(1) min stack

 1 public class MinStack {
 2
 3     /** initialize your data structure here. */
 4     static Stack<Integer> numStack;
 5     static Stack<Integer> minStack;
 6
 7     public MinStack() {
 8         numStack = new Stack<Integer>();
 9         minStack = new Stack<Integer>();
10     }
11
12     public void push(int x) {
13         numStack.push(x);
14         if (minStack.empty() || x <= minStack.peek()) {
15             minStack.push(x);
16         }
17     }
18
19     public void pop() {
20         if (numStack.peek().equals(minStack.peek())) {
21             //note!!! because Stack contains integer which is an object, is use == will test its pointer!!!
22             minStack.pop();
23             numStack.pop();
24
25         } else {
26             numStack.pop();
27         }
28     }
29
30     public int top() {
31         return numStack.peek();
32     }
33
34     public int getMin() {
35         return minStack.peek();
36     }
37 }

min stack

(2) implement queue by two stack

 1 class MyQueue {
 2     private Stack<Integer> stack1 = new Stack<Integer>();
 3     private Stack<Integer> stack2 = new Stack<Integer>();
 4
 5     // Push element x to the back of queue.
 6     public void push(int x) {
 7         if (!stack2.empty()){
 8             move();
 9         }
10         stack1.push(x);
11
12     }
13     private void move() {
14         if (!stack2.empty()) {
15             while (!stack2.empty()) {
16               stack1.push(stack2.pop());
17             }
18             return;
19         } else {
20             while (!stack1.empty()) {
21               stack2.push(stack1.pop());
22             }
23             return;
24         }
25     }
26
27     // Removes the element from in front of queue.
28     public void pop() {
29         if (!stack1.empty()) {
30             move();
31         }
32         stack2.pop();
33     }
34
35     // Get the front element.
36     public int peek() {
37         if (!stack1.empty()) {
38             move();
39         }
40         return stack2.peek();
41     }
42
43     // Return whether the queue is empty.
44     public boolean empty() {
45         if (!stack1.empty() || !stack2.empty()) {
46             return false;
47         }
48         return true;
49     }
50 }

(3)Largest rectangle in histogram

Given n non-negative integers representing the histogram‘s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

The largest rectangle is shown in the shaded area, which has area = 10 unit.

For example,
Given heights = [2,1,5,6,2,3],
return 10.

暴力方法:

for矩阵的起点

需要用到“单调栈”

这道题的核心点是:最矮的木头!

1. //for矩阵的最爱的那根木头,也就是矩阵的高度

2.记住,单调栈能够做到找到左边比一个比当前小的点,能找到右边第一个比它小的点

3. 单调栈里实际上存的是下标,在比较增序关系的时候才用值去比较

------------------------我是分割线----------------------------------------

时间: 2024-10-05 11:49:51

数据结构笔记的相关文章

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先 本篇名言:"生活真象这杯浓酒 ,不经三番五次的提炼呵 , 就不会这样一来可口 ! -- 郭小川" 继续看下广度优先的遍历,上篇我们看了深度遍历是每次一个节点的链表是走到底的. 欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47029275 1.  原理 首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径 本篇名言:"富贵不淫贫贱乐 ,男儿到此是豪雄.-- 程颢" 这次来看下有向无环图的另一个应用关键路径. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135061 1.  关键路径 与AOV-网相对应的是AOE-网(Activity On Edge)即边表示活动的网.AOE-网是一个带权的有向无环图,其中,顶点表示事件(Event),弧表示活动,权表

49. 蛤蟆的数据结构笔记之四十九图的连通性问题

49. 蛤蟆的数据结构笔记之四十九图的连通性问题 本篇名言:"我们不得不饮食.睡眠.游惰.恋爱,也就是说,我们不得不接触生活中最甜蜜的事情:不过我们必须不屈服于这些事物 .....--约里奥?居里"     此篇就作为数据结构入门笔记的最后一篇吧. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135259 设图G=(V,E)是一个无向图,G的一个连通分支是一个最大的连通子图,即一个连通分支是不包含在任何更大的

46. 蛤蟆的数据结构笔记之四十六普里姆算法

46. 蛤蟆的数据结构笔记之四十六普里姆算法 本篇名言:"手莫伸 ,伸手必被捉.党与人民在监督 ,万目睽睽难逃脱.汝言惧捉手不伸 ,他道不伸能自觉 , 其实想伸不敢伸 ,人民咫尺手自缩.-- 陈毅" 连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小.构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最

44. 蛤蟆的数据结构笔记之四十四弗洛伊德Floyd算法

44. 蛤蟆的数据结构笔记之四十四弗洛伊德Floyd算法 本篇名言:"希望是厄运的忠实的姐妹. --普希金" 我们继续来看下数据结构图中的一个算法,这个算法来自图灵奖得主. 1.  Floyd算法介绍 Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名.注意这个可不是心理学的那个弗洛伊德. 是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径

41 蛤蟆的数据结构笔记之四十一图的遍历之深度优先

41  蛤蟆的数据结构笔记之四十一图的遍历之深度优先 本篇名言:"对于我来说 , 生命的意义在于设身处地替人着想 , 忧他人之忧 , 乐他人之乐. -- 爱因斯坦" 上篇我们实现了图的邻接多重表表示图,以及深度遍历和广度遍历的代码,这次我们先来看下图的深度遍历. 欢迎转载,转载请标明出处: 1.  原理 图遍历又称图的遍历,属于数据结构中的内容.指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它

33. 蛤蟆的数据结构笔记之三十三广义表实现二

33. 蛤蟆的数据结构笔记之三十三广义表实现二 本篇名言:" 希望是附丽于存在的,有存在,便有希望,有希望,便是光明.--鲁迅" 我们继续来看下广义表的其他代码实现.代码均来自网络,解释来自蛤蟆,均亲测可行. 欢迎转载,转载请标明出处: 1.  广义表实现二 1.1         main 创建两个链表的指针head和L. 输入一个字符串,调用GLCreate函数创建广义表.显示,获取头表,尾表,输出长度,深度,原子个数,复制列表,Merge列表,遍历,比较广义表操作. 如下图1:

34. 蛤蟆的数据结构笔记之三十四树的概念

34. 蛤蟆的数据结构笔记之三十四树的概念 本篇名言:"过去属于死神,未来属于你自己.--雪莱" 本篇笔记开始我们要进入新的概念了,树!是不是有点小激动呢?让我们从概念开始吧 当然概念要理解,如果当前不能立刻理解,可以后续结合代码一起理解效果更佳. 1.  树型结构 之前我们学习的那么多,其实都是线性数据结构. 树 则不同,它是非线性结构. 树形结构指的是数据元素之间存在着"一对多"的树形关系的数据结构,是一类重要的非线性数据结构.在树形结构中,树根结点没有前驱结点

C语言、数据结构笔记集合

链表中的“p->next” p->next到底是指p的下一个节点还是p的指针域呢?p是一个指针,那么p->next也应该是一个指针,即p->next应该是一个地址,因此p->next其实是p指向的节点的指针域(next域),所以p->next还是属于当前节点的,只不过它是下一个节点的地址罢了.所以如果函数返回“p->next”,那么函数的类型应为指针函数. 如何让VS2013进行C编程的时候使用基本库函数不会得到警告 把VS项目创建中的安全周期检查关闭就可以任意使

数据结构笔记之——括号匹配(栈的应用之一)(SDOJ 2134)

//  度过了上周的悲催状态,我决定好好学习了-- //书上括号匹配是栈的简单应用,正好在SDOJ上看到这道题,顺便做了下 题目地址:SDOJ 2134 数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出