leetcode每日一题

539. 最小时间差

示例 1:

输入:timePoints = [“23:59”,“00:00”]
输出:1

示例 2:

输入:timePoints = [“00:00”,“23:59”,“00:00”]
输出:0

class Solution {public int findMinDifference(List<String> time) {int len = time.size();List<Integer> list = new ArrayList<>();for(int i = 0;i < time.size();i++){String temp = time.get(i).substring(0,2) + time.get(i).substring(3,5);list.add(Integer.parseInt(temp));if(Integer.parseInt(temp) < 1200){list.add(Integer.parseInt(temp)+2400);}}Collections.sort(list);int res = Integer.MAX_VALUE;for(int i = 0;i < list.size()-1;i++){int hour = list.get(i+1)/100 - list.get(i)/100;int cha = list.get(i+1) - list.get(i);res= Math.min(res,cha - hour * 40);}return res;}
}

小tip:

这道题能被暴力排序通过是没想到的,只是想测试测一下,结果ac了。。吃惊,大大的吃惊。。。

结果有点差强人意,但还算可以。。

官方题解

根据题意,一共有 24 \times 60=144024×60=1440 种不同的时间。由鸽巢原理可知,如果 \textit{timePoints}timePoints 的长度超过 14401440,那么必然会有两个相同的时间,此时可以直接返回 00。

class Solution {public int findMinDifference(List<String> timePoints) {int n = timePoints.size();if (n > 1440) {return 0;}Collections.sort(timePoints);int ans = Integer.MAX_VALUE;int t0Minutes = getMinutes(timePoints.get(0));int preMinutes = t0Minutes;for (int i = 1; i < n; ++i) {int minutes = getMinutes(timePoints.get(i));ans = Math.min(ans, minutes - preMinutes); // 相邻时间的时间差preMinutes = minutes;}ans = Math.min(ans, t0Minutes + 1440 - preMinutes); // 首尾时间的时间差return ans;}public int getMinutes(String t) {return ((t.charAt(0) - '0') * 10 + (t.charAt(1) - '0')) * 60 + (t.charAt(3) - '0') * 10 + (t.charAt(4) - '0');}
}

巧妙的点:

雀巢原理,超过总和直接返回0

直接计算首尾的计算分钟差

自构造函数,将String格式直接转换成分钟数然后进行向加减

雀巢原理(抽屉原理)

抽屉算法,又叫雀巢原理

网上的抽屉算法很好理解,也很普通,没什么好的学习

举例:

桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的“抽屉原理”。

Quorum机制

苹果抽屉理论只是对它的理解, Quorum 是一种集合 , l 中任意取集合S,R ,S,R 都存在交集。当然,本文并不打算多讲它的数学定义方面的理解,这里只是提供个信息,看不懂也没事联系到前面的分布式读写模型就能很容易理解这个了。

运用Quorum机制来解决读写模型中读写的负载均衡。其实,关键的是更新多少个数据副本后,使得读取时总能读到有效数据?回想我们的的红苹果,假设总共有 N 个数据副本,其中 k 个已经更新,N-k 个未更新的,那么我们任意读取 N-k+1 个数据的时候就必定至少有1个是属于更新了的k个里面的,也就是 Quorum 的交集,我们只需比较 读取的 N-k+1 中版本最高的那个数据返回给用户就可以得到最新更新的数据了。

那么对于写模型呢?我也只需要完成 k个副本的更新后,就可以告诉用户操作完成而不需要 Write All 了,当然告诉完用户完成操作后,系统内部还是会慢慢的把剩余的副本更新,这对于用户是透明的。可以看到,我们把 Write 身上的部分负载转移到了Read上,Read读取多个副本,使得Write不会过于劳累,不好的是弱化了分布式系统中的数据一致性。至于转移多少负载比较合适,这个需要根据分布式系统的具体需求中对数据一致性的要求。不过,CAP 理论告诉我们没有完美的方案。

原理应用

为保证在各个节点副本数据一致性,以前一般采用加锁的方法。 然而加锁是悲观的方法,对性能影响比较大。

N表示数据所具有的副本数。

R表示完成读操作所需要读取的最小副本数,即一次读操作所需参与的最小节点数目。

W表示完成写操作所需要写入的最小副本数,即一次写操作所需要参与的最小节点数目。

该策略中,只需要保证R + W>N,就可以保证强一致性。 如果R + W ≤ N,这时读取和写入操作是不重叠的,系统只能保证最终一致性,而副本达到一致的时间则依赖于系统异步更新的实现方式,不一致性的时间段也就等于从更新开始到所有的节点都异步完成更新之间的时间。

假设N=5, 如果R=1, 那么W必须是5. 所以就是写入所有的节点是全部节点,那么读取任何一个节点就可以最新的数据。 有点就是像读写锁了。

如果R=5, 那么W只要是1就可以了。 那么写的效率就非常高。 读取的效率比较低。

如果R=N/2+1, W=N/2, 读写之间为达到某个平衡。 是不错的策略。

兼顾了性能和可用性,Dynamo系统的默认设置就是这种。

leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用相关推荐

  1. LeetCode每日一题(题1028)

    题1028 前言 题目 思路 代码 错误 后记 前言 最近在刷LeetCode每日一题,每次做完之后总能有些收获,所以想着不如每天写个博客记录一下做的题目的解法以及自己写的时候问题出在哪里. 题目 从 ...

  2. leetcode每日刷题计划-简单篇day8

    leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...

  3. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  4. 【LeetCode每日一题】1723. 完成所有工作的最短时间

    [LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...

  5. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

  6. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  7. leetcode每日一题·救生艇问题(Python)

    leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...

  8. LeetCode每日一题——904. 水果成篮

    LeetCode每日一题系列 题目:904. 水果成篮 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整 ...

  9. LeetCode每日一题打卡组队监督!刷题群!

    近 2000 人已经加入共同刷题啦! 群友每天都会在群里给大家讲解算法题 每周日「负雪明烛」组织直播讲题 我相信来看我博客的大部分人都是通过LeetCode刷题过来的.最近发现LeetCode中文网站 ...

最新文章

  1. [测试]将TestCase整合
  2. linux ps查看进程命令
  3. mysql 批量修改数据库存储引擎_mysql批量修改表存储引擎
  4. 最全BAT前端开发面试80题:算法+html+js+css!含答案大赠送!
  5. md5加密+盐方式一
  6. mac识别androidUSB调试
  7. [Luogu 3835]【模板】可持久化平衡树
  8. 多个模块使用python logging
  9. H5与客户端交互的方式有哪些? 怎么做?
  10. 除了输入法,移动端AI还有哪些想象空间?
  11. Pycharm下载包慢的问题
  12. MySql获取某天是一年的第几周
  13. mysql mdf修复_LDF文件丢失, 如何仅用MDF文件恢复数据库呢?
  14. Mr.Xiong使用jQuery实现时钟表盘的效果
  15. Oracle数据库恢复时要建库吗_【DB】数据库面试笔试题库及详解(小麦苗DBA宝典出品)数据库运维宝典...
  16. 公众号第三方平台开发 教程五 代公众号处理消息和事件
  17. 11+++各类计算机病毒介绍
  18. 牛客网数据开发题库_牛客网刷题笔记--数据库
  19. 调用office web 365接口实现在线预览word文档,PDF,PPT
  20. OpenCV的下载、安装和配置

热门文章

  1. IOS APP 公司主体变更的转让流程
  2. 微信定向流量_使用定向流量包怎么算?微信定向流量包怎样计算流量?
  3. 远程控制桌面,手机外网远程桌面连接内网的实现过程,详细图文并茂
  4. 基于android2.3.5系统:源码下载及android体系架构
  5. Windows装逼操作
  6. oracle控制台转圈进不去,老鸟帮你win10输完密码一直转圈圈进不去的具体方法
  7. 用电脑看电视的方法!!
  8. windows与mac字体设置
  9. 已解决SyntaxError: Non-UTF-8 code starting with ‘\xe8‘ in file
  10. 环球好货VIP会员首次建群的方法及话术