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