Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅
第一阶段目标是:200道,每天1到2篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目:798. 得分最高的最小轮调
给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调,这样可以使数组变为 [nums[k], nums[k + 1], ... nums[nums.length - 1], nums[0], nums[1], ..., nums[k-1]] 的形式。此后,任何值小于或等于其索引的项都可以记作一分。
例如,数组为 nums = [2,4,1,3,0],我们按 k = 2 进行轮调后,它将变成 [1,3,0,2,4]。这将记为 3 分,因为 1 > 0 [不计分]、3 > 1 [不计分]、0 <= 2 [计 1 分]、2 <= 3 [计 1 分],4 <= 4 [计 1 分]。 在所有可能的轮调中,返回我们所能得到的最高分数对应的轮调下标 k 。如果有多个答案,返回满足条件的最小的下标 k 。
示例 1:
输入:nums = [2,3,1,4,0] 输出:3 解释: 下面列出了每个 k 的得分: k = 0, nums = [2,3,1,4,0], score 2 k = 1, nums = [3,1,4,0,2], score 3 k = 2, nums = [1,4,0,2,3], score 3 k = 3, nums = [4,0,2,3,1], score 4 k = 4, nums = [0,2,3,1,4], score 3 所以我们应当选择 k = 3,得分最高。 示例 2:
输入:nums = [1,3,0,2,4] 输出:0 解释: nums 无论怎么变化总是有 3 分。 所以我们将选择最小的 k,即 0。
提示:
1 <= nums.length <= 105 0 <= nums[i] < nums.length
示例 1:
输入:s = "||***|", queries = [[2,5],[5,9]] 输出:[2,3] 解释:
- queries[0] 有两个盘子在蜡烛之间。
- queries[1] 有三个盘子在蜡烛之间。 示例 2:
输入:s = "*||||||", queries = [[1,17],[4,5],[14,17],[5,11],[15,16]] 输出:[9,0,0,0,0] 解释:
- queries[0] 有 9 个盘子在蜡烛之间。
- 另一个查询没有盘子在蜡烛之间。
提示:
3 <= s.length <= 105 s 只包含字符 '*' 和 '|' 。 1 <= queries.length <= 105 queries[i].length == 2 0 <= lefti <= righti < s.length
我的思路
创建一个差分数组differ[k], 代表轮调k时的差分值, 根据nums中的每个下标i以及nums[i]找出对应的k增加的区间,在差分数组上进行调整, 最后根据差分数组还原原数组找出最大score的最小k
代码实现
/**
* @param {number[]} nums
* @return {number}
*/
var bestRotation = function(nums) {
const n = nums.length
let differ = new Array(n).fill(0) // differ为每个k得分数组的差分数组
// 对于每对i和nums[i],可以确定对应的k的范围,在这个范围内的k都会得1分(对一段数组范围同时加上一个值,可以用差分数组操作,降低时间复杂度)
for (let i = 0 ; i < n; i++) {
const x = nums[i]
if (i >= x && i <= n - 1) {
differ[0] += 1
if (i < n - 1) {
differ[i + 1] += 1
}
if (i - x + 1 < n) {
differ[i - x + 1] -= 1
}
} else {
if (i < n - 1) {
differ[i + 1] += 1
}
if (i + n - x + 1 < n) {
differ[i + n - x + 1] -= 1
}
}
}
let ans = 0, max = differ[0]
for (let i = 1; i < n; i++) {
differ[i] += differ[i - 1]
if (differ[i] > max) {
ans = i
max = differ[i]
}
}
return ans
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹