每日两题 T1
算法
LeetCode T365. 水壶问题[1]
描述
有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?
如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升水。
你允许:
•装满任意一个水壶•清空任意一个水壶•从一个水壶向另外一个水壶倒水,直到装满或者倒空
示例 1: (From the famous *"Die Hard"* example[2])
输入: x = 3, y = 5, z = 4
输出: True
示例 2:
输入: x = 2, y = 6, z = 5
输出: False
分析
首先我们要明确一点,每次操作仅仅会让桶中水的总量增加 x或增加 y,减少或减少 y。
因为在题目给定的条件下,两个桶不存在都有水并且都不满的情况,换言之,操作后,两个桶中水至少一个是空或者满。再者,我们分析易知:对一个不满的桶加水是没有什么意义的,为什么呢?因为给一个不满的桶加水其实就相当于将该桶初始化为满桶水;同理将一个未装满水桶的水倒掉也没有意义。
通过分析我们还能得出,两桶水的总量是否能满足给定的z是取决于x、y两桶容量的差值,也就是说差的制造是通过反复将大桶中的水倒入小桶产生的,整个操作描述如下:
1.往 y 壶倒水
2.把 y 壶的水倒入 x 壶 3.如果 y 壶不为空,那么 x 壶肯定是满的,把 x 壶倒空,然后再把 y 壶的水倒入 x 壶 4.重复以上操作直至某一步时 x 壶进行了 m 次倒空操作,y 壶进行了 n 次倒水操作。
由贝祖定理可得:mx+ny=z,当且仅当z是x、y最大公约数的倍数时,成立,因此,我们只需找出x、y最大公约数即可。
源码
/**
* @param {number} x
* @param {number} y
* @param {number} z
* @return {boolean}
*/
var canMeasureWater = function(x, y, z) {
if (x + y < z) {
return false;
}
if (x === 0 || y === 0) {
return (z === 0) || (x + y === z);
}
return (z % calcGcd(x, y)) === 0;
};
function calcGcd(a, b) {
if (b === 0) {
return a;
}
return calcGcd(b, a % b);
}
前端
React / Vue 项目为什么要在列表组件中写 key,其作用是什么?
key是虚拟节点的唯一id,通过可以能够更快更准确找到更新前对应的虚拟节点。
Vue
和React
都是通过diff算法对比新旧虚拟树节点差异,然后更新节点。当新旧节点对比不一致时,会根据节点的key去找寻旧节点,如果未找到则表明为新的节点,反之会进行复用。
针对这个问题我们应该辩证看待,并不是说书写key一定是好的,一定是提升性能的。
Vue
如果是简单列表,且列表只是单纯数据展示,无相关状态的更改,则可不使用key,这样在数据更新重新渲染时会更快,因为会跳过key的检索与复用逻辑
React
不管何时,都要求列表必须带key,大家阅读过React
都会发现,在commit阶段,更新操作通过复用来提升性能,这样虽然会有额外性能开销,但是对比频繁的DOM更新,还是能接受的。
References
[1]
365. 水壶问题: https://leetcode-cn.com/problems/water-and-jug-problem/
[2]
*"Die Hard"* example: https://www.youtube.com/watch?v=BVtQNK_ZUJg
- hdu----(4301)Divide Chocolate(状态打表)
- hdu------(4300)Clairewd’s message(kmp)
- TensorFlow ML cookbook 第一章7、8节 实现激活功能和使用数据源
- Go语言struct类型详解
- spark1.x升级spark2如何升级及需要考虑的问题
- 使用 kubeadm 创建一个 kubernetes 集群
- Oracle 12c 多租户专题|CDB元数据内幕
- 深入分析golang多值返回以及闭包的实现
- Hadoop3.0扩展Yarn资源模型详解2:资源Profiles说明
- hdu------(1525)Euclid's Game(博弈决策树)
- Go语言指针访问结构体的方法
- Spring Boot & Spring Cloud 应用内存管理
- hdu----(1849)Rabbit and Grass(简单的尼姆博弈)
- 10分钟让你明白MySQL是如何利用索引的
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于Linux安装Mysql5.7
- 纯CSS实现iOS风格打开关闭选择框
- 算法基础:递归
- ELK日志收集原理+es集群+elk搭建+本地目录文件读取,搭建分布式日志收集系统
- 什么是JavaScript 的闭包???
- es集群+elk搭建+kafka搭建分布式日志收集系统
- 设计模式(2)[JS版]---JavaScript如何实现单例模式?
- 算法基础:分治
- 黑客帝国中代码雨如何实现?用 canvas 轻松实现代码雨炫酷效果!
- 设计模式(3)[JS版]-JavaScript中的构造函数模式是什么?
- 基于docker 安装elasticsearch + kibana + ik分词器(6.7.2版本)
- 算法基础:排序
- 算法基础:动态规划
- 什么是 “并查集” ?
- Sentinel + SpringBoot 基于本地文件模式实现规则持久化