leetcode标记数组

1、Valid Sudoku
链接:https://leetcode.com/problems/valid-sudoku/
思路:一次遍历行、列、小格子;标记数组

public boolean isValidSudoku(char[][] board) {
    if(board==null || board.length!=9 || board[0].length!=9)
        return false;
    for(int i=0;i<9;i++)
    {
        boolean[] map = new boolean[9];
        for(int j=0;j<9;j++)
        {
            if(board[i][j] != '.')
            {
                if(map[(int)(board[i][j]-'1')])
                {
                    return false;
                }
                map[(int)(board[i][j]-'1')] = true;
            }
        }
    }
    for(int j=0;j<9;j++)
    {
        boolean[] map = new boolean[9];
        for(int i=0;i<9;i++)
        {
            if(board[i][j] != '.')
            {
                if(map[(int)(board[i][j]-'1')])
                {
                    return false;
                }
                map[(int)(board[i][j]-'1')] = true;
            }
        }
    }        
    for(int block=0;block<9;block++)
    {
        boolean[] map = new boolean[9];
        for(int i=block/3*3;i<block/3*3+3;i++)
        {
            for(int j=block%3*3;j<block%3*3+3;j++)
            {
                if(board[i][j] != '.')
                {
                   if(map[(int)(board[i][j]-'1')])
                   {
                      return false;
                   }
                   map[(int)(board[i][j]-'1')] = true;    
                }
            }
        }
    }
    return true;
}

2、Next Permutation
链接:https://leetcode.com/problems/next-permutation/
思路:从后边找到递增序列,交换
这里写图片描述

    public void nextPermutation(int[] nums) {
        if(nums == null || nums.length == 0 || nums.length == 1)
            return;
        int len = nums.length, flag = -1,temp = 0,m = 0, n = len - 1;
        for(int i = len - 2 ; i >=0; --i){
            if(nums[i] < nums[i + 1]){
                flag = i;
                for(int j = len - 1; j >= i; j--)
                    if(nums[j] > nums[i]){
                        temp = nums[j];
                        nums[j] = nums[i];
                        nums[i] = temp;
                        break;
                    }
                break;
            }
        }
        n = len - 1;
        m = flag >= 0 ? flag + 1 : 0;
        while(m < n){
            temp = nums[m];
            nums[m] = nums[n];
            nums[n] = temp;
            m++;
            n--;
        }
    }

3、Word Search
链接:https://leetcode.com/problems/word-search/
思路:递归回溯思想,用一个数组保存走过的路。

    public boolean exist(char[][] board, String word) {
        if(board == null || board.length ==0 || board[0].length == 0)
            return false;
        int leni = board.length, lenj = board[0].length;
        if(word.length() > leni * lenj)
            return false;
        boolean[][] flag = new boolean[leni][lenj];
        for(int i = 0; i < leni; i++)
            for(int j = 0; j < lenj; j++){
                if(search(board, word,0, i, j, flag))
                    return true;
            }
        return false;
    }

    public boolean search(char[][] board, String word,int k, int i, int j, boolean[][] flag){
        if(k == word.length())
            return true;
        if(i < 0 || j < 0 || i >= board.length || j >= board[0].length || flag[i][j] || board[i][j] != word.charAt(k))
            return false;
        flag[i][j] = true;
        boolean res = search(board, word, k + 1, i + 1, j, flag) || search(board, word, k + 1, i, j + 1, flag) || search(board, word, k + 1, i - 1, j, flag) ||search(board, word, k + 1, i, j - 1, flag);
        flag[i][j] = false;
        return res;
    }

4、Remove Duplicates from Sorted Array
链接:https://leetcode.com/problems/remove-duplicates-from-sorted-array/
思路:两个指针,依次覆盖

    public int removeDuplicates(int[] nums) {
        if(nums == null || nums.length <= 1)
            return nums.length;
        int len = nums.length,i = 0;
        for(int k = 0; k < len; k++){
            while(k + 1 < len && nums[k] == nums[k + 1]) k++;
            nums[i++] = nums[k];
        }
        return i;
    }

5、Remove Duplicates from Sorted Array II
链接:https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/
思路:两个指针,思路同上。

    public int removeDuplicates(int[] nums) {
        if(nums.length <= 2)
            return nums.length;
        int i = 0, len = nums.length;
        boolean count = false;
        for(int j = 0; j < len; j++){
            count = false;
            while(j + 1 < len && nums[j] == nums[j + 1]){
                j++;
                count = true;
            }
            nums[i++] = nums[j];
            if(count)
                nums[i++] = nums[j];
        }
        return i;
    }

6、Sort Colors
链接:https://leetcode.com/problems/sort-colors/
思路:red放头,blue放尾,遍历一次,按条件交换位置。

    public void sortColors(int[] nums) {
        int len = nums.length, temp;
        if(len <= 1)
            return;
        int red = 0, blue = len - 1;
        for(int k = 0; k <= blue; k++){
            if(nums[k] == 0){
                temp = nums[red];
                nums[red++] = nums[k];
                nums[k] = temp;
            }else if(nums[k] == 2){
                temp = nums[blue];
                nums[blue--] = nums[k];
                nums[k--] = temp;
            }
        }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值