1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
实例1
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
实例2
输入:nums = [-1,-2,-3,-4,-5], target = -8
输出:[1,2]
实例3
输入:nums = [3,3], target = 6
输出:[0,1]
提示
- 2 <= nums.length <= 104
- 109 <= nums[i] <= 109
- 109 <= target <= 109
进阶: 你可以想出一个时间复杂度小于 O(n2) 的算法吗?
解答
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const n=nums.length;
for(let i=0;i<n;i++){
var temp = nums[i];
nums[i]='';
let index = nums.indexOf(target-temp);
if(index!=-1){
return [i,index];
}
nums[i]=temp;
}
};
2. 有效的数独
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 ‘.’ 表示。
实例1
输入:board =
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:true
实例2
输入:board =
[["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:false
解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
提示
- board.length == 9
- board[i].length == 9
- board[i][j] 是一位数字(1-9)或者 ‘.’
解答
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
for(let i=0;i<board.length;i++){
// 行、列判断
for(let j=0;j<board[i].length;j++){
if(board[i][j]!=='.'){
if(!isTure(i,j,board)) return false
}
}
// 九宫格
if(!isNine(board)) return false;
}
return true;
};
function isTure(i,j,board){
// 行遍历
for(let m=j+1;m<board[i].length;m++){
if(board[i][m]===board[i][j]) return false;
}
// 列遍历
for(let n=i+1;n<board[i].length;n++){
if(board[n][j]===board[i][j]) return false;
}
return true;
}
// 确定九宫格坐标
function isNine(board){
for(let i=0;i<board.length;i +=3){
for(let j=0;j<board.length;j+=3){
if(!isSet(i,j,board)) return false;
}
}
return true;
}
// 判断九宫格是否重复
function isSet(i,j,board){
const set = new Set();
let k=0;
for(let m=0;m<3;m++){
for(let n=0;n<3;n++){
if(board[i+m][j+n]==='.'){
k++;
continue;
}
set.add(board[i+m][j+n])
}
}
if(set.size===9-k) return true;
return false
}
3. 旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
实例1
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
实例2
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
提示
- n == matrix.length == matrix[i].length
- 1 <= n <= 20
- 1000 <= matrix[i][j] <= 1000
解答
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function(matrix) {
const n=matrix.length;
const arr = new Array(n).fill(0).map(()=>new Array(n).fill(0));
for(let i=0;i<n;i++){
for(let j=0;j<n;j++){
arr[j][n-1-i] = matrix[i][j];
}
}
for(let i=0;i<n;i++){
for(let j=0;j<n;j++){
matrix[i][j] = arr[i][j];
}
}
};