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;
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章