算法日记 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)
实在是没忍住我把数独给做了一下
分析:
无论是 行 、 列 还是 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
};