[路飞]_leetcode第278周竞赛(上)

154 阅读1分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

2154. 将找到的值乘以 2

题目

给你一个整数数组 nums ,另给你一个整数 original ,这是需要在 nums 中搜索的第一个数字。

接下来,你需要按下述步骤操作:

如果在 nums 中找到 original ,将 original 乘以 2 ,得到新 original(即,令 original = 2 * original)。 否则,停止这一过程。 只要能在数组中找到新 original ,就对新 original 继续 重复 这一过程。 返回 original 的 最终 值。

示例1

输入:nums = [5,3,6,1,12], original = 3
输出:24
解释: 
- 3 能在 nums 中找到。3 * 2 = 6 。
- 6 能在 nums 中找到。6 * 2 = 12 。
- 12 能在 nums 中找到。12 * 2 = 24 。
- 24 不能在 nums 中找到。因此,返回 24 。

示例2

输入: nums = [2,7,9], original = 4
输出: 4
解释:
4 不能在 nums 中找到。因此,返回 4 。

题解

哈希表 + 记录每个元素

用哈希表记录 numsnums 的每个元素,然后不断将 originaloriginal 乘 22 直至其不在哈希表中。

var findFinalValue = function(nums, original) {
    const map = [];
    nums.forEach(v=>{
        map[v] = 1;
    })
    while(map[original]){
        original = original * 2
    }
    return original

};

2155. 分组得分最高的所有下标

题目

给你一个下标从 0 开始的二进制数组 nums ,数组长度为 n 。nums 可以按下标 i( 0 <= i <= n )拆分成两个数组(可能为空):numsleft 和 numsright 。

numsleft 包含 nums 中从下标 0 到 i - 1 的所有元素(包括 0 和 i - 1 ),而 numsright 包含 nums 中从下标 i 到 n - 1 的所有元素(包括 i 和 n - 1 )。 如果 i == 0 ,numsleft 为 空 ,而 numsright 将包含 nums 中的所有元素。 如果 i == n ,numsleft 将包含 nums 中的所有元素,而 numsright 为 空 。 下标 i 的 分组得分 为 numsleft 中 0 的个数和 numsright 中 1 的个数之 和 。

返回 分组得分 最高 的 所有不同下标 。你可以按 任意顺序 返回答案。

示例1

输入:nums = [0,0,1,0]
输出:[2,4]
解释:按下标分组
- 0 :numsleft 为 [] 。numsright 为 [0,0,1,0] 。得分为 0 + 1 = 1 。
- 1 :numsleft 为 [0] 。numsright 为 [0,1,0] 。得分为 1 + 1 = 2 。
- 2 :numsleft 为 [0,0] 。numsright 为 [1,0] 。得分为 2 + 1 = 3 。
- 3 :numsleft 为 [0,0,1] 。numsright 为 [0] 。得分为 2 + 0 = 2 。
- 4 :numsleft 为 [0,0,1,0] 。numsright 为 [] 。得分为 3 + 0 = 3 。
下标 2 和 4 都可以得到最高的分组得分 3 。
注意,答案 [4,2] 也被视为正确答案。

示例2

输入:nums = [0,0,0]
输出:[3]
解释:按下标分组
- 0 :numsleft 为 [] 。numsright 为 [0,0,0] 。得分为 0 + 0 = 0 。
- 1 :numsleft 为 [0] 。numsright 为 [0,0] 。得分为 1 + 0 = 1 。
- 2 :numsleft 为 [0,0] 。numsright 为 [0] 。得分为 2 + 0 = 2 。
- 3 :numsleft 为 [0,0,0] 。numsright 为 [] 。得分为 3 + 0 = 3 。
只有下标 3 可以得到最高的分组得分 3 。

题解

简单模拟

题目中已知:下标 i 的 分组得分 为 numsleft 中 0 的个数和 numsright 中 1 的个数之 和

  • 第1次枚举,得到1的数量放入 oneone
  • 用变量 zerozero 记录 0 的数量
  • 第2次枚举,从左到右,遇0时 zero+1zero+1 ,遇1时 one1one-1
  • maxmax 记录 zero+onezero+one 最大值
  • mapmap 记录每个 zero+onezero+one 的个数
  • 返回 map[max]map[max]
var maxScoreIndices = function (nums) {
  let one = 0
  const len = nums.length
  for (let i = 0; i < len; i++) {
    if (nums[i] === 1) one++
  }
  let map = {}
  let max = one
  map[one] = [0]
  let zero = 0
  for (let i = 1; i <= len; i++) {
    if (nums[i - 1] === 0) zero++
    if (nums[i - 1] === 1) one--
    const k = zero + one
    max = Math.max(max, k)
    if (map[k] === undefined) {
      map[k] = [i]
    } else {
      map[k].push(i)
    }
  }
  return map[max]
}

优化

进一步优化,省略哈希变量 mapmap 变量 maxmax 是递增的,题目要求只取分组得分最高,如果maxmax增加,之前存储在 map[max]map[max] 中的数据就之需要删除重新存放即可。

var maxScoreIndices = function (nums) {
  let one = 0
  const len = nums.length
  for (let i = 0; i < len; i++) {
    if (nums[i] === 1) one++
  }
  let max = one

  let zero = 0
  let result = [0]
  for (let i = 1; i <= len; i++) {
    if (nums[i - 1] === 0) zero++
    if (nums[i - 1] === 1) one--
    const k = zero + one
    if( k  > max){
        max = k;
        result = [i]
    }else if(k === max){
        result.push(i)
    }
  }
  return result
}