当前位置: 首页>后端>正文

算法修炼记录

public class kkkk {
public static void main(String[] args) {
int a[] ={1,2,3,4,6};
int target=6;
/++i 和i++ ,先相加后返回的区别,在此处其实效果都一样/
twoSum(a,target);
System.out.println("------");
twoSuma(a,target);
char[][] 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'}
};
// 三个布尔数组 表明 行, 列, 还有 3
3 的方格的数字是否被使用过
boolean[][] rowUsed = new boolean[9][10];
boolean[][] colUsed = new boolean[9][10];
boolean[][][] boxUsed = new boolean[3][3][10];
// 初始化
for(int row = 0; row < board.length; row++){
for(int col = 0; col < board[0].length; col++) {
int num = board[row][col] - '0';
if(1 <= num && num <= 9){
rowUsed[row][num] = true;
colUsed[col][num] = true;
boxUsed[row/3][col/3][num] = true;
}
}
}
// 递归尝试填充数组
recusiveSolveSudoku(board, rowUsed, colUsed, boxUsed, 0, 0);
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
System.out.print(board[i][j] + " ");
if(j==8){
System.out.println("------");
}
}
}
System.out.println();

}
public static boolean recusiveSolveSudoku(char[][]board, boolean[][]rowUsed, boolean[][]colUsed, boolean[][][]boxUsed, int row, int col){
    // 边界校验, 如果已经填充完成, 返回true, 表示一切结束
    if(col == board[0].length){
        col = 0;
        row++;
        if(row == board.length){
            return true;
        }
    }
    // 是空则尝试填充, 否则跳过继续尝试填充下一个位置
    if(board[row][col] == '.') {
        // 尝试填充1~9
        for(int num = 1; num <= 9; num++){
            boolean canUsed = !(rowUsed[row][num] || colUsed[col][num] || boxUsed[row/3][col/3][num]);
            if(canUsed){
                rowUsed[row][num] = true;
                colUsed[col][num] = true;
                boxUsed[row/3][col/3][num] = true;

                board[row][col] = (char)('0' + num);
                if(recusiveSolveSudoku(board, rowUsed, colUsed, boxUsed, row, col + 1)){
                    return true;
                }
                board[row][col] = '.';

                rowUsed[row][num] = false;
                colUsed[col][num] = false;
                boxUsed[row/3][col/3][num] = false;
            }
        }
    } else {
        return recusiveSolveSudoku(board, rowUsed, colUsed, boxUsed, row, col + 1);
    }
    return false;
}
/**数组中找出两个数和为指定数值*/
public static int[] twoSum(int[] nums, int target) {
        int numa=nums.length;
    for (int i = 0; i < numa; ++i) {
        for (int j = i+1; j < numa; ++j) {
            if(nums[i]+nums[j]==target){
                return new int[]{i,j};
            }
        }
    }
    return new int[0];
}
public static int[] twoSuma(int[] nums, int target) {
    int numa=nums.length;
    for (int i = 0; i < numa; i++) {
        for (int j = i+1; j < numa; j++) {
            if(nums[i]+nums[j]==target){
                return new int[]{i,j};
            }
        }
    }
    return new int[0];
}

}


https://www.xamrdz.com/backend/3pr1936712.html

相关文章: