算法日记 2024/4/18

42 阅读3分钟

算法日记 2024/4/18

两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

作者:LeetCode 链接:leetcode.cn/leetbook/re… 来源:力扣(LeetCode)

1. 双循环暴力破解

就是两两相加和为目标值就返回,相当简单

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
  for (var i = 0; i < nums.length - 1; i++) {
    for (var j = i + 1; j < nums.length; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j]
      }
    }
  }
};

2. Map单循环

目标值减去其中一个值可以得到另一个值,我们可以通过遍历数组,将遍历值添加到Map中键为数组项值为下标,这样当目标值减去遍历值的结果在Map中时就可以取到时对应的数组下标就是结果,用空间换时间

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
  const hashMap = new Map()
  for(var i = 0; i < nums.length; i++) {
    if (hashMap.get(target - nums[i]) !== undefined) {
      return [hashMap.get(target - nums[i]), i]
    }
    hashMap.set(nums[i], i)
  }
  return [0, 0]
};

有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

注意:

一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。 空白格用 '.' 表示。

作者:LeetCode 链接:leetcode.cn/leetbook/re… 来源:力扣(LeetCode)

实在是没忍住我把数独给做了一下

Snipaste_2024-01-17_15-11-11.png

分析:

无论是 还是 3*3的小单元 其实可以用 9*9二维数组 来表示,那么我们可以建立三个 9*9二维数组 ,然后通过循环遍历数独数组,内层的数组可以为出现的数字做标记,该项内层数组若再次出现已标记的数字则不是有效的数独,吐槽一句这个方法是我看解析里面别人写的,js 创建二维数组是真的沙贝

/**
 * @param {character[][]} board
 * @return {boolean}
 */
var isValidSudoku = function(board) {
  const row = Array()
  const col = Array()
  const cell = Array()
  for(var a = 0; a < 9; a++) {
    row.push(Array(9))
    col.push(Array(9))
    cell.push(Array(9))
  }
  for (var i = 0; i < board.length; i++) {
    for(var j = 0; j < board.length; j++) {
      // 计算当前所属 3*3 单元
      const k = Math.floor(i / 3) + 3 * Math.floor(j / 3)
      // 空项直接跳过
      if (board[j][i] === '.') continue
      // 由于数字是1-9,减1之后作为内层数组下标标记对应数字
      const num = board[j][i] / 1 - 1
      if (row[i][num] !== undefined || col[j][num] !== undefined || cell[k][num] !== undefined) {
        return false
      }
      row[i][num] = col[j][num] = cell[k][num] = 1
    }
  }
  return true
};