有序表(接口)

红黑树、跳表、AVL树、SB树   复杂度O(logN)

题目一:

根据最大高度的变化,maxH,

把原数组改成开始位置增加,结束位置减少的数组

[2,6,8]   改成  [2,add,8],[6,del,8]

[7,11,9] 改成 [7,add,11] , [11,del,9]

[4,8,5] 改成 [4,add,5],[8,del,5]

[1,14,4] 改成 [1,add,4],[14,del,4]

[3,5,3] 改成 [3,add,3],[5,del,3]

根据第一维数据排序,相同的add排在前面(防止意外如[7,7,9])

准备一个map1,key是高度,value是出现的次数

准备一个map2,key是坐标,value是该坐标的最大高度

map1和map2都是有序表

public static class Node{public int x;//x轴上的值public boolean isAdd;//true为加入,false为删除public int h; //高度public Node(int x, boolean isAdd, int h){this.x = x;this.isAdd = isAdd;this.h = h;}//排序的比较策略//1.第一个维度的x值从小到大//2.如果第一个维度的值相等,看第二个维度的值,“加入”排在前,“删除”排在后//3.如果两个对象第一维度和第二维度的值都相等,则认为两个对象相等,谁在前都行public static class NodeComparator implements Comparator<Node> {public int compara(Node o1, Node o2){if (o1.x != o2.x){return o1.x - o2.x;}if(o1.isAdd != o2.isAdd){return 01.isAdd ? -1 : 1;}return 0;}}
}public static List<List<Integer>> buildingOutline(int[][] matrix){Node[] nodes = new Node[matrix.length * 2];//每一个大楼轮廓数组,产生两个描述高度变化的对象for(int i = 0; i < matrix.length; i++){node[i * 2] = new Node(matrix[i][0], true, matrix[i][2]);node[i * 2 + 1] = new Node(matrix[i][1], false, matrix[i][2]);}//把描述高度变化的对象数组,按照规定的排序策略排序Arrays.sort(nodes, new NodeComparator());//TreeMap就是java中的红黑树结构,直接当作有序表来使用TreeMap<Integer, Integer> mapHeightTimes = new TreeMap<>();TreeMap<Integer, Integer> mapHeight = new TreeMap<>();for(int i = 0; i < nodes.length; i++){if(nodes[i].isAdd){if(!mapHeightTimes.containsKey(nodes[i].h)){//没有出现的高度直接新加记录mapHeightTimes.put(nodes[i].h,1);} else{ //之前出现的高度,次数加1即可mapHeightTimes.put(nodes[i].h,mapHeightTimes.get(nodes[i].h) + 1);}}else {//如果当前是删除操作if(mapHeightTimes.get(nodes[i].h) == 1){//如果当前的高度出现次数为1,直接删除mapHeightTimes.remove(nodes[i].h);}else{//如果当前的高度出现次数大于1,次数减一即可mapHeightTimes.put(nodes[i].h, mapHeightTimes.get(nodes[i],h) - 1);}}//根据mapHeightTimes中的最大高度,设置mapXvalueHeight表if(mapHeightTimes.isEmpty()){ //如果maxHeightTimes为空,说明最大高度为0mapXHeight.put(node[i].x, 0);}else {//如果mapHeightTimes不为空,通过mapHeightTimes.lastKey()取得最大高度mapXHeight.put(nodes[i].x, mapHeoghtTimes.lastKey());}}//res为结果数组,每一个List<Integer>代表一个轮廓线,有开始位置,结束位置,高度,一共三个信息List<List<Integer>> res =new ArrayList<>();//从一个新轮廓线的开始位置int start = 0;//之前的最大高度int preHeight = 0;//根据mapXvalueHeight生成res数组for(Entry<Integer, Integer> entry : mapXHeight.entrySet()){//当前位置int curX = entry.getKey();//当前最大高度int curMaxHeight = entry.getValue();if (preHeight != curMaxHeight){//之前最大高度和当前最大高度不一样if(preHeight != 0){res.add(new ArrayList<>(Arrays.asList(start, curX, preHeight)));}start = curX;preHeight = curMaxHeight;}}
}

题目二:给定一个数组,该数组无序,但每个值均为正数,再给定一个正数K。求arr的所有子数组中所有元素相加和为k的最长子数组长度

滑动窗口

构建单调性

双指针:L和R

sum < K  R++

sum > K L++

sum == k,收集答案,R++

public static int getMaxLength(int[] arr, int k){if(arr == null || arr.length == 0 || k <= 0){return 0;}int left = 0;int right = 0;//[left...right]//如果left == right+ 1表示窗口不再有数int sum = arr[0];int len = 0;while(right < arr.length){if(sum == k){len = Math.max(len, right - left + 1);sum -= arr[left++];} else if(sum < k){right ++;if(right == arr.length){break;}sum += arr[right];} else {sum -= arr[left++];}}return len;
}

拓展:无序数组有正有负有0,小于等于K的最长子数组长度

arr[ 1 , 2 , 5, -4, 3 , -1]

minsum[1 , 2 , 1, -4 , 2, -1] 从i出发的子数组,取得的最小sum

minsumend[0 , 1 , 3 , 3 , 5 , 5] 从i出发的子数组,取得最小sum时的右边界

对于某位置的数只存在俩种可能性:1)自己 2)往右扩

从0出发扩到一个位置不能扩后,来到1位置,sum-arr[0],看能否把18位置的数扩进来

窗口不回退(只关注窗口能否变长)

题目三:给定一个非负数组,每个值都代表该位置上有几个铜板,a和b玩游戏,a先手,b后手,轮到某个人的时候,只能在一个位置上拿任意数量的铜板,但是不能不拿。谁最先把铜板拿完谁赢,假设a和b都极度聪明,请返回获胜者的名字。

Nim博弈

思路:谁先让对方面对全0的状态谁就赢

数组中所有数异或和起来,不为0先手赢,为0后手赢

5        2        4

101    010     100    异或后为011

2和4异或后为110,5拿完后小于110不能在5上拿

5和4异或后为001,可以在2上拿一个

B站左程云算法视频高级班02相关推荐

  1. B站左程云算法视频高级班01

    题目1:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要不能用非基于比较的排序 [               ]假设是长度为9的数组 首先遍历数组 找出min 和 ma ...

  2. B站左程云算法视频高级班05

    题目一:在一个无序数组中,求第k小的数 快排:荷兰国旗问题 BFPRT 有讲究的选择一个数 之后的步骤和快排一样 假设整个方法叫f函数 f(arr, k) 1)0~4一组 5~9一组 0~14一组 剩 ...

  3. B站左程云算法视频基础提升02

    岛问题 一个矩阵中只有0和1两种值,每个位置都可以和自己的上下左右相连,如果一片1连在一起,这个部分叫做一个岛,求一个矩阵有多少个岛 思路:遍历,infect class Solution {publ ...

  4. B站左程云算法视频笔记(01

    1.位运算 异或 ^ ,可理解为不进为相加,满足结合律和交换律 a^a=0: a^0=a: 交换a和b a=a^b: b=a^b: a=a^b: 但必须满足是位置不同的(同一内存位置自己异或结果为0) ...

  5. B站左程云算法视频笔记05

    大数据 有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL (布隆过滤器或者哈希函数分流) [补充]某搜索公司一天的用户搜索词汇是海量的(百亿数据量),请设计一种 ...

  6. 左程云算法笔记(四)哈希表和有序表的使用、链表

    左程云算法笔记(四) 哈希表的使用 有序表的使用 链表 单链表反转 (LC206) 双向链表反转 打印两个有序链表的公共部分 合并两个有序链表(LC21) 判断一个链表是否为回文结构 (LC234) ...

  7. LeetCode左程云算法课笔记

    左程云算法课笔记 剑指Offer 位运算 ^运算符理解 寻找出现双中的单数 取出一个数最右边1的位置 找所有双出现中的两个单数 整数二进制奇数位偶数位交换 数组中全部出现k次返回出现一次的数 链表 判 ...

  8. 左程云算法笔记总结-基础篇

    基础01(复杂度.基本排序) 认识复杂度和简单排序算法 时间复杂度 big O 即 O(f(n)) 常数操作的数量写出来,不要低阶项,只要最高项,并且不要最高项的系数 一个操作如果和样本的数据量没有关 ...

  9. CSDN专访左程云,算法之道

    算法的庞大让很多人畏惧,程序员如何正确的学习并应用于面试.工作中呢?今天,CSDN邀请了IBM软件工程师.百度软件工程师.刷题5年的算法热爱者左程云,来担任CSDN社区问答栏目的第二十六期嘉宾,届时会 ...

  10. 算法与数据结构——算法基础——二叉树(java)(b站左程云课程笔记整理)

    二叉树 了解一个二叉树的递归序.先序.中序.后序 递归序:每个数会被打印三次(可以理解为前中后) 先序:头左右 中序:左头右 后序:左右头 public static class Node {publ ...

最新文章

  1. Centos7状态下查看防火墙状态及修改服务端口
  2. 我眼里的几种失败的人生
  3. NLP复习资料(4)-第八章 句法分析
  4. 红旗linux安装oracle,Redflag Linux安装Oracle 10gR2 RAC记事
  5. 自学html和css,学习HTML和CSS的5大理由
  6. maven release插件将一版本发布到仓库中时Return code is: 401, ReasonPhrase:Unauthorized
  7. Android 音频开发(二) 采集一帧音频数据
  8. linux apache + mysql +php no-yum
  9. android第十二步Pull解析器解析和生成XML内容
  10. gstreamer的插件如何复制数据
  11. 计算机四级网络工程师题库及详细知识点大全
  12. 【linux学习笔记】Linux网络管理综合项目实训任务书
  13. 服务器c盘缓存文件夹,c盘存放缓冲文件的地方在哪里
  14. UCenter 来自网络
  15. 诛仙3服务器查询系统,《诛仙3》4月1日服务器数据互通公告
  16. 读书笔记-别做正常的傻瓜
  17. 怎么修改win8计算机用户名和密码忘了怎么办,win8怎么修改用户名 Win8修改用户名与目录名的办法...
  18. 图解迪士尼发展史:华特·迪士尼建立的动画王国
  19. SpringBoot使用RXTX连接串口教程及遇到的坑总结
  20. 表单验证与自定义表单验证

热门文章

  1. 国内最大最专业最活跃的前十大FPGA论坛社区网站精选
  2. ps 卸载失败 更多故障_如何给自己更多时间来卸载Windows 10更新
  3. CCA(典型相关分析)
  4. Directx12 曲面细分详解
  5. IIS无法启动解决方案
  6. vs2019 IIS Express Web服务器无法启动
  7. (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.5播放视频文件
  8. MATLAB机器人仿真:利用plot3d显示真实三维仿真模型
  9. 计算机文化基础(高职高专版 第十一版)第六章 答案
  10. 万能密码 php,PHP万能密码