大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟。
欢迎小伙伴们加我微信:
sudongyuer
拉你进群,一起讨论,期待与大家共同成长🥂。
前言🌧️
算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。
因为开发的过程就是把实际问题转换成计算机可识别的指令,也就是《数据结构》里说的,「设计出数据结构,在施加以算法就行了」。
当然,学习也是有侧重点的,作为前端我们不需要像后端开发一样对算法全盘掌握,有些比较偏、不实用的类型和解法,只要稍做了解即可。
分而治之是什么? 😊
- 分而治之是
算法设计中的一种方法
。 - 它将一个问题
分
成多个和原问题相似的小问题,递归解决
小问题,再将结果合
并以解决原来的问题。
场景一:归并排序 🍃
- 分:把数组从中间一分为二。
- 解:递归地对两个子数组进行归并排序。
- 合:合并有序子数组
场景二:快速排序 🍃
- 分:选基准,按基准把数组分成两个子数组。
- 解:递归地对两个子数组进行快速排序。
- 合: 对两个子数组进行合并。
猜数字大小-分而治之🦀
题目
难度简单
猜数字游戏的规则如下:
- 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
- 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num)
来获取猜测结果,返回值一共有 3 种可能的情况(-1
,1
或 0
):
- -1:我选出的数字比你猜的数字小
pick < num
- 1:我选出的数字比你猜的数字大
pick > num
- 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!
pick == num
返回我选出的数字。
示例 1:
输入:n = 10, pick = 6 输出:6
示例 2:
输入:n = 1, pick = 1 输出:1
示例 3:
输入:n = 2, pick = 1 输出:1
示例 4:
输入:n = 2, pick = 2 输出:2
提示:
1 <= n <= 231 - 1
1 <= pick <= n
解题思路
- 二分搜索,同样具备“分、解、合”的特性。
- 考虑选择分而治之思想
解题步骤
分:计算中间元素,分割数组。
解:递归地在较大或者较小子数组进行二分搜索。
合: 不需要此步,因为在子数组中搜到就返回了。
源码
/** * Forward declaration of guess API. * @param {number} num your guess * @return -1 if num is lower than the guess number * 1 if num is higher than the guess number * otherwise return 0 * var guess = function(num) {} */ /** * @param {number} n * @return {number} */ var guessNumber = function(n) { const rec=(low,higher)=>{ if(low>=higher){ return low } const mid=Math.floor((low+higher)/2) if(guess(mid)===0){ return mid } else if(guess(mid)===1){ return rec(mid+1,higher) } else if(guess(mid)===-1){ return rec(low,mid-1) } } return rec(1,n) };
结束语🌞
那么鱼鱼的LeetCode算法篇的「LeetCode」JavaScript-分而治之⚡️
就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾
,欢迎加我好友
,一起沙雕
,一起进步
。