2022初级算法数组3

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];
        }
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值