当前位置: 首页 > news >正文

ytwzjs烟台网站建设wordpress 微信plugin

ytwzjs烟台网站建设,wordpress 微信plugin,海南澄迈住房与建设厅网站,上海网页设计公司排行[JavaScript 刷题] 特殊数组的特征值, leetcode 1608 这道题在一个列表上看到的,刚开始用暴力解想过了就过了,不过后面看了一下关键字,发现解法……非常有趣。 时间复杂度可以从 O(n2)O(n^2)O(n2) 降为 O(nlog(n))O(n log(n))O(nlog(n))&am…

[JavaScript 刷题] 特殊数组的特征值, leetcode 1608

这道题在一个列表上看到的,刚开始用暴力解想过了就过了,不过后面看了一下关键字,发现解法……非常有趣。

时间复杂度可以从 O(n2)O(n^2)O(n2) 降为 O(nlog(n))O(n log(n))O(nlog(n)),再降为 O(n)O(n)O(n),顺便记一下学习过程,毕竟很少看到简单题这么复杂的。

题目

You are given an array nums of non-negative integers. nums is considered special if there exists a number x such that there are exactly x numbers in nums that are greater than or equal to x.

Notice that x does not have to be an element in nums.

Return x if the array is special, otherwise, return -1. It can be proven that if nums is special, the value for x is unique.

解题思路

暴力解

题意问的是是否存在特殊数字 x,使得数组中出现大于等于 x 的数字正好等同鱼 x 本身。假设数组中所有的数字都比 x 大,那么最多存在 nums.length 个数字,反之则是 0。

这道题给的上限是 1 <= nums.length <= 100,也就是说 x 的上限为 100,暴力解的时间复杂度就是 n2n^2n2,也就是 10000,所以不会超时(甚至还没一些题目的 input 多)。

暴力解的做法就是遍历两次数组,每次便利的时候记录大于等于当前值 i 出现的次数,如果计算出来正好等于 i,则可以直接返回当前 i,解法如下:

function specialArray(nums: number[]): number {for (let i = 1; i <= nums.length; i++) {let counter = 0;for (let j = 0; j < nums.length; j++) {console.log(nums[j], counter);if (nums[j] >= i) counter++;if (counter > i) break;}if (counter === i) return i;}return -1;
}

排序

另一种思路是排序去做,排序完了之后只需要从大到小找比当前的 i 大的数字出现的次数即可。

[3,6,7,7,0] 为例,排序后的结果为 [7, 7, 6, 3, 0]

x = 17>17 > 17>1 所以继续执行。

x = 27>27 > 27>2 所以继续执行。

x = 36>26 > 26>2 所以继续执行。

x = 43<43 < 43<4,已经不满足存在于 x 个数字大于等于 x 本身这一条件,因此可以直接返回 −1-11

解法如下:

function specialArray(nums: number[]): number {nums.sort((a, b) => b - a);let x: number = -1;for (let i = 1; i <= nums.length; i++) {if (nums[i - 1] >= i) {x = i;continue;}if (nums[i - 1] >= x) return -1;}return x;
}

这样的解法时间复杂度为 $ O(nlog(n))$,会比暴力解更加的有效。

二分搜索

二分算法的过程以及原理和排序就有点相似,已知结果只可能存在于 1<=x<=1001 <= x <= 1001<=x<=100,因此对这个区间进行二分搜索,找到出现 >=x>= x>=x 的数字正好出现 xxx 次的这个值。

function specialArray(nums: number[]): number {let left = 1,right = nums.length;while (left <= right) {const mid = Math.floor((left + right) / 2);const count = nums.reduce((accum, curr) => (mid <= curr ? accum + 1 : accum),0);if (count === mid) return mid;if (count > mid) left = mid + 1;else right = mid - 1;}// need to check when left is also a posible solutionconst count = nums.reduce((accum, curr) => (left <= curr ? accum + 1 : accum),0);return count === left ? left : -1;
}

虽然也是 $ O(nlog(n)),不过二分算法少走了一个遍历,因此速度相比较而言会快一些(,不过二分算法少走了一个遍历,因此速度相比较而言会快一些(,不过二分算法少走了一个遍历,因此速度相比较而言会快一些(left <= nums.length$ 是肯定的),不过大 O 都一样。

桶排序

桶排序利用的是所有的数字都可能会被归类到 1−1001 - 1001100 的这个容器中,将所有的数字全都归类到对应的桶里进行倒叙的频率检查,最后找到符合条件的特殊数字即可。

function specialArray(nums: number[]): number {const length = nums.length;const buckets = new Array(length + 1).fill(0);for (const num of nums) {buckets[Math.min(num, length)] += 1;}let count = 0;for (let i = length; i > 0; i--) {// since it's frequence, so we can check count directly after adding the frequencycount += buckets[i];if (count === i) return count;}return -1;
}

这里走了两个遍历,所以时间复杂度是 O(n)O(n)O(n),应该来说是没办法找到更优的解法了。

http://www.yayakq.cn/news/996592/

相关文章:

  • 重庆企业网络推广价格哈尔滨企业网站seo
  • 微信群领券网站怎么做简单网站建设优化
  • 观澜做网站公司全栈网站开发工程师
  • 专业做化学招聘的网站有哪些桥头仿做网站
  • 仙居网站建设贴吧烟台元和网络科技有限公司
  • 岳阳市住房和城乡建设局网站网站app怎么做的
  • 扬州做网站的公司哪个好大庆门户网站
  • 做网站时图片要切片有什么作用浙江平湖建设局网站
  • 外贸营销网站制作域名网
  • 施工员证书查询网站最好的网站建设
  • 郑州给公司做网站的公司做网站图片要求
  • 网站建设动漫wordpress 漏洞 2014
  • 网站页面优化内容包括哪些烟台网站建设报价
  • 四川红叶建设有限公司网站动态Js文件 做网站标题
  • 电商网站流量统计cpancel面板搭建WordPress
  • 做视频网站视频文件都存放在哪建e室内设计网app
  • 营销型网站一般有哪些内容网站建设的步骤是什么意思
  • 深圳精品网站建设常州企业网站建设公司
  • 淘宝客网站推广备案信息2021年世界500强榜单
  • 网站建设具体流程图windows网站建设教程
  • 个人网站炫酷主页html创意界面
  • 做手机版网站和做app差别创建站点的方法
  • 网站只做静态页面安全受到影响个人网站创建平台
  • 黑马程序员官方网站阿里云 wordpress ftp
  • 自己做的网站服务器开了进不去企业所得税优惠政策2019
  • 东庄水利枢纽建设公司网站公司网站用什么系统
  • 网站建设任务执行书国外设计素材网站免费
  • 济南网站制作哪家最好深圳网页设计培训多少钱
  • 网站地图 wordpresscvm服务器做网站
  • 做国外网站有哪些微信公众平台开发实例教程