遍历

P1452 旋转卡壳

偶尔善良 提交于 2020-02-02 04:13:10
题面 给定平面n个点,求凸包直径(输出凸包直径的平方) 2 < = n < = 50000 2<=n<=50000 2 < = n < = 5 0 0 0 0 (实测存在一列点构成直线的数据) 分析 凸包直径:凸包两两顶点间最远的距离 容易想到O(n 2 )的方法, 求出凸包 后遍历顶点对求距离max即可 但有更优的做法,遍历的一个点移动一次,其对面的点(对踵点)移动的幅度并不会太大,并且旋转方向相同(同顺时针或同逆时针),所以其实存在O(N)的做法。 这种遍历一般有两种:点-点遍历,边-点遍历: 第二种在代码上实现更容易(第一种貌似有特例,如特别扁的图形,会失去长度的单峰性) 过程即start边在凸包上移动,分别找出每个start边的最远opposite点。这个最远可以用三角形面积来衡量,如图上的那样,根据平行线的知识,过其他顶点作start边的平行线,最远的平行线可以使三角形面积最大,也就是最远的点。这时计算这个最远点与start两端点的距离取max即得出当前start边下能得到的最大直径。对所有start边下的直径取max即是全局最大直径。 如何快速找出对每一个start最远的opposite?如果单纯遍历仍然会落入O(n 2 )。而通过观察同一start下三角形的面积是一个单峰函数(平行线从近到远再到近),并且已知start移动一次,这个峰移动不会太大,而且是同向移动

python学习笔记九 之 字典

坚强是说给别人听的谎言 提交于 2020-02-02 01:04:18
文章目录 字典 字典的创建 {} dict() 获取字典值 根据键获取值 get(key[, default]) 修改字典 dict[key]=value dict.setdefault(key[,default]) update(dict) 删除键值对 del dict.popitem() dict.pop(key[,default]) dict.clear() 字典的遍历 keys() values() items() len() in、not in dict.copy() 字典 字典属于python中叫做映射的数据结构; 字典的作用与列表类似,都是用于存储数据; 列表的存储性能好,但查询性能差;如,查找列表中某个值时,在不知道其索引的情况下就只能遍历整个列表; 字典中每一个元素都有一个唯一的名字,通过这个唯一的名字可以快速的查找到指定的元素; 字典的存储性能差,查询性能好; 字典中可以保存多个对象,字典中对象称为值(value);每个对象都有唯一的名字,对象的名字称为键(key),通过键可以快速的查找对应的值(value); 字典也称做键值对(结构),每个字典都可以有多个键值对,每个 键值对称为一项(item) 字典的创建 {} 创建一个空字典 创建非空字典对象 语法:{key:value,key:value,key:value} 字典的值可以为任意对象(int、bool

T11-链表的倒数第k个节点

做~自己de王妃 提交于 2020-02-02 00:44:15
题目描述 输入一个链表,输出该链表中倒数第k个结点。 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 解题思路 此题,开始就想到引入一个栈,对链表遍历,并且一次压入栈,之后再从栈中弹出k个节点,即为所求。但是这样虽然只遍历了一遍链表,但是引入栈带来了额外的空间消耗,并不是最佳算法。 那么,换个思路,求倒数第k个节点,但是链表只能从头至尾遍历。所以,如果我们能够知道链表的长度length,我们就可以直接从头向后遍历至第length-k+1个节点即可。 此方法,两个循环,每个循环时间复杂度都是o(n); 再进一步分析,能不能只遍历链表一次? 如果想只遍历一次,那么就需要遍历至指针指向第length-k+1个节点,但length不知,就需要考虑一种能替换length的方法。这里就想到,用一个指针1从头至尾遍历,也就相当于length,再来一个指针2在指针1遍历到第k个节点时,再跟着一起遍历即可。 源代码 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public : ListNode * FindKthToTail ( ListNode * pListHead ,

《LeetCode笔记1》:岛屿数量

会有一股神秘感。 提交于 2020-02-01 08:48:35
题目 给定一个由 '1' (陆地)和 '0' (水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 示例1: 输入: 11110 11010 11000 00000 输出: 1 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/number-of-islands 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解法一: BFS BFS用的是队列。(速度慢) 1. 遍历整块大陆,横着竖着遍历都可以。 2.第一次碰到陆地的时候,就知道这是块岛屿了,所以将这块陆地放入探险队列,岛屿数量加一。 3.然后我们将这块岛屿的陆地探索完。每一次将这块陆地周围(上下左右)的陆地放入队列,然后将这块陆地标记为已探索(这里就直接置为'0'了)。 4.当探险队列为空时,表示这块岛屿的陆地全部被探索完了,我们继续寻找下一块陆地。 (原文链接:https://blog.csdn.net/dongmuyang/article/details/94408324) 解法二: DFS(栈+递归)(速度快) 1.遍历整块大陆。 2.当遇到为‘1’的点时,以该点为起点进行四邻域深度优先遍历,将遍历到的点都置为‘0’。其为1个岛屿。 3.继续寻找下一块陆地

顺序存储二叉树

我怕爱的太早我们不能终老 提交于 2020-02-01 08:46:46
顺序存储二叉树 基本说明 从数据存储来看,数组存储方式和树的存储方式可以相互转换 数组 《------》 树 要求:在遍历数组arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式来完成对结点的遍历。 概念 顺序存储二叉树通常仅仅考虑完全二叉树 第n个元素的左子节点为2 * n + 1; 第n个元素的右子节点为2 * n + 2; 第n个节点的父节点为(n - 1) /2; n表示为二叉树中第几个元素(注意:编号是从0开始记的) 图示: 应用实例 八大排序算法中的堆排序,使用的就是顺序存储为叉树。 用顺序存储二叉树实现树的三种遍历 前序遍历: 思路分析: 判断树是否为空 先输出根节点, 在判定左子节点是否为空,在进行左子结点的递归输出 最后判定右子结点是否为空,在进行递归输出 没有了就return 代码实现: public void preOrder ( ) { this . preOrder ( 0 ) ; } //重载方法,是程序看起来更加干净简洁 /**\ * * @param index 标识为数组的下标 * */ public void preOrder ( int index ) { if ( arr == null || arr . length == 0 ) { //有没有数组长度为0,还不为空的数组 //经过实验发现,确实存在如此蛋疼的数组 //两种情况

目录的遍历

做~自己de王妃 提交于 2020-02-01 04:28:18
今天就来讲讲目录的遍历: 如上图:我想把E盘下的8888文件夹下的文件以及文件夹全部遍历出来 有两种方法: public String[] list():返回一个String数组,表示该File目录中的所有子文件或目录 public File[] listFiles():返回一个File数组,表示该File目录中的所有的子文件或目录 我们来用代码演示一下: public class Demo05 { public static void main(String[] args) throws IOException { File dir = new File("E:\\8888"); //获取当前目录下的文件以及文件夹的名称 String[] names = dir.list(); for (String name : names) { //然后打印 System.out.println(name); } } } //打印 E:\java\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA java\5.1.46\mysql-connector-java-5.1.46.jar com.xiaoxiao.IODemo.Demo05 CentOS-7.0-1406-x86_64-DVD.iso ideaIU

Java总结05 Java集合体系.最高集合接口Collection和其迭代器/一般集合接口List和其迭代器/增强版For循环的应用

谁说我不能喝 提交于 2020-02-01 03:36:06
Collection - 集合 Iterator - 迭代器 Revise — 修改(rɪˈvaɪz) ** 1. 一/Collection集合的创建与应用 Collection本身是个接口,那么如果要把它以集合形式去应用,那么就需要用到多态.而子类则必须是个集合实现类,比如ArrayList. 格式: Collection<E泛型> 多态集合对象自定义名 = new ArrayList<E>(); 如: Collection<String> collectionListObj = new ArrayList<String>(); 常用方法: 1/对象名.add(); 添加元素 2/对象名.remove(); 删除指定元素,因为没有索引值,所以如果存在多个相同元素,则删除最靠前的. 3/对象名.isEmpty(); 判断集合中的元素是否全部为空内容元素,如果是则True,不是则False 4/对象名.contains(); 判断指定元素是否存在集合中 5/对象名.clear(); 清空所有元素(即将所有元素内容清空) 6/对象名.size(); 取集合长度 public static void main ( String [ ] args ) { Collection < String > collectionListObj = new ArrayList < String > (

PHP 数组

主宰稳场 提交于 2020-02-01 00:10:04
数组能够在单个变量中存储多个值: 实例 <?php$cars=array("Volvo","BMW","Toyota");echo"I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";?> 运行实例 » 数组是什么? 数组是一个能在单个变量中存储多个值的特殊变量。 如果您有一个项目清单(例如:车名字的清单),将其存储到单个变量中,如下所示: $cars1="Volvo"; $cars2="BMW"; $cars3="Toyota"; 然而,如果您想要遍历数组并找出特定的一个呢?如果数组的项不只 3 个而是 300 个呢? 解决办法是创建一个数组! 数组可以在单个变量中存储多个值,并且您可以根据键访问其中的值。 在 PHP 中创建数组 在 PHP 中,array() 函数用于创建数组: array(); 在 PHP 中,有三种类型的数组: 数值数组 - 带有数字 ID 键的数组 关联数组 - 带有指定的键的数组,每个键关联一个值 多维数组 - 包含一个或多个数组的数组 PHP 数值数组 这里有两种创建数值数组的方法: 自动分配 ID 键(ID 键总是从 0 开始): $cars=array("Volvo","BMW","Toyota"); 人工分配 ID 键: $cars[0]="Volvo"; $cars

Java基础——数组

。_饼干妹妹 提交于 2020-01-31 22:58:13
Java基础——数组 数组 数组的概念:存储同一种 数据类型 多个元素的集合,既可以存储 基本数据类型 ,也可以存储 引用数据类型 。 数组的作用:为了存储 同种数据类型 的多个值。 定义格式: 数据类型[] 数组名 = new 数据类型[数组的长度];( 动态初始化 ) 数据类型[] 数组名 = {元素1,元素2,···};( 静态初始化 ) 数组的初始化 定义:为数组开辟连续的内存空间,并为每一个数据元素赋值。 分类: 动态初始化:只指定长度,由系统给出默认初始化值。 静态初始化:给出初始化值,由系统指定长度。 Java中的内存分配以及栈和堆的区别 内存分配 栈通过得到堆的地址找到相应的堆 栈和堆的区别 栈:存储 局部变量 (定义子啊方法声明上和方法中的变量),具有 先进后出 的原则。 堆:存储 new 出来的数组和对象。 数组操作中两个常见的小问题 数组索引越界异常 ArrayIndexOutOfBoundsException 原因:访问了不存在的索引 空指针异常 NullPointerException 原因:当数组引用赋值为 null ,再去调用数组中的元素 一维数组的基本操作 数组的遍历 定义:依次输出数组中的每一个元素 数组的长度: Array.length 数组的最大索引: Array.length-1 一维数组的遍历 /* 数组的遍历,利用方法提高复用性 */

java 快速失败(fail—fast)和 安全失败(fail—safe)

落爺英雄遲暮 提交于 2020-01-31 22:02:38
一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程(迭代器迭代)中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent ModificationException(这个异常只建议用于检测并发修改的bug)。 场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。 用ArrayList来解释 (AbstractList是ArrayList父类) 大部分博客是解释modCount != expectedModCount 这里我需要特别强调这两个属性并不是位于同一个类而是 java . util . AbstractList#modCount! = java . util . AbstractList . Itr#expectedModCount 当我们对ArrayList对象进行数据修改操作的时候将会触发java . util . AbstractList#modCount 加 1 , 当我们使用迭代器遍历ArrayList对象的时候,会新建一个迭代器对象(java . util . AbstractList . Itr) 同时初始化java . util . AbstractList . Itr#expectedModCount为java . util . AbstractList