最大三角形面积
最大三角形面积
给你一个由 X-Y 平面上的点组成的数组 points ,其中 points[i] = [xi, yi] 。从其中取任意三个不同的点组成三角形,返回能组成的最大三角形的面积。与真实值误差在 10-5 内的答案将会视为正确答案。
输入:points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出:2.00000
解释:输入中的 5 个点如上图所示,红色的三角形面积最大。
输入:points = [[1,0],[0,0],[0,1]]
输出:0.50000
12345678910111213141516const largestTriangleArea = function(points) { const n = points.length; let ret = 0.0; for (let i = 0; i < n; i++) { for (let j = i + 1; j < n; j++) { for (let k = j + 1; ...
多数元素 II
多数元素 II
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
输入:nums = [3,2,3]
输出:[3]
输入:nums = [1]
输出:[1]
输入:nums = [1,2]
输出:[1,2]
123456789101112131415161718var majorityElement = function(nums) { let map = new Map(); let len = nums.length; for(let i=0; i<len; i++) { map.set(nums[i], map.has(nums[i]) ? map.get(nums[i]) + 1 : 1) } let seperateLine = Math.floor(len / 3) const res = []; for(let [key, value] of map.entries()) { if(value > se ...
划分字母区间
划分字母区间
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。返回一个表示每个字符串片段的长度的列表。
输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:划分结果为 “ababcbaca”、”defegde”、”hijhklij” 。每个字母最多出现在一个片段中。像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。
输入:s = “eccbbbbdec”
输出:[10]
思路先统计每个字符的结束位置,再根据结束位置做切割
解题方法统计每个字符结束位置,放入哈希表中遍历字符串,找寻一定范围内字符最远出现的下标位置当最远下标位置等于当前下标,说明找到一个分割点
1234567891011121314151617181920var partitionLabels = function(s) { // 先找每个字母的边界,为了找一定范围内最大值 ...
下一个排列
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。给你一个整数数组 nums ,找出 nums 的下一个排列。必须 原地 修改,只允许使用额外常数空间。
下一个排列
输入:nums = [1,2,3]
输出:[1,3,2]
输入:nums = [3,2,1]
输出:[1,2,3]
12345678 ...
最长特殊序列 II
最长特殊序列 II
给定字符串列表 strs ,返回其中 最长的特殊序列 的长度。如果最长特殊序列不存在,返回 -1 。特殊序列 定义如下:该序列为某字符串 独有的子序列(即不能是其他字符串的子序列)。s 的 子序列可以通过删去字符串 s 中的某些字符实现。例如,”abc” 是 “aebdc” 的子序列,因为您可以删除”aebdc”中的下划线字符来得到 “abc” 。”aebdc”的子序列还包括”aebdc”、 “aeb” 和 “” (空字符串)。
输入: strs = [“aba”,”cdc”,”eae”]
输出: 3
输入: strs = [“aaa”,”aaa”,”aa”]
输出: -1
1234567891011121314151617181920212223242526272829303132var findLUSlength = function(strs) { let map = {}, max = 0, str // 哈希表计数 并且寻找最长字符串 for (let i = strs.length - 1; ...
实现sum(1,2,3)==sum(1)(2)(3)
实现 sum(1,2,3)==sum(1)(2)(3)1234567891011121314151617function sum(...args){ function currySum(...rest){ args.push(...rest) return currySum } currySum.toString= function(){ return args.reduce((result,cur)=>{ return result + cur }) } currySum.toNumber= function(){ return args.reduce((result,cur)=>{ return result + cur }) } return currySum}
单例模式
单例模式
单例模式即一个类只能构造出唯一实例,单例模式的意义在于共享、唯一,Redux/Vuex 中的 store、JQ 的$或者业务场景中的购物车、登录框都是单例模式的应用
123456789101112131415161718class SingletonLogin { constructor(name,password){ this.name = name this.password = password } static getInstance(name,password){ //判断对象是否已经被创建,若创建则返回旧对象 if(!this.instance)this.instance = new SingletonLogin(name,password) return this.instance }} let obj1 = SingletonLogin.getInstance('CXK','123')let obj2 = Singleto ...
代理模式
代理模式
代理模式,为一个对象找一个替代对象,以便对原对象进行访问。即在访问者与目标对象之间加一层代理,通过代理做授权和控制。最常见的例子是经纪人代理明星业务,假设你作为一个投资者,想联系明星打广告,那么你就需要先经过代理经纪人,经纪人对你的资质进行考察,并通知你明星排期,替明星本人过滤不必要的信息。事件代理、JQuery 的$.proxy、ES6 的 proxy 都是这一模式的实现,下面以 ES6 的 proxy 为例:
1234567891011121314151617181920212223const idol = { name: '蔡x抻', phone: 10086, price: 1000000 //报价}const agent = new Proxy(idol, { get: function(target) { //拦截明星电话的请求,只提供经纪人电话 return '经纪人电话:10010' }, set: function(target, key, ...
适配器模式
适配器模式
适配器模式,将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。我们在生活中就常常有使用适配器的场景,例如出境旅游插头插座不匹配,这时我们就需要使用转换插头,也就是适配器来帮我们解决问题。
123456789101112131415161718class Adaptee { test() { return '旧接口' }} class Target { constructor() { this.adaptee = new Adaptee() } test() { let info = this.adaptee.test() return `适配${info}` }} let target = new Target()console.log(target.test())
装饰器模式
装饰器模式
装饰器模式,可以理解为对类的一个包装,动态地拓展类的功能,ES7的装饰器语法以及React中的高阶组件(HoC)都是这一模式的实现。react-redux的connect()也运用了装饰器模式,这里以ES7的装饰器为例:
12345678910function info(target) { target.prototype.name = '张三' target.prototype.age = 10}@infoclass Man {}let man = new Man()man.name // 张三