第18天--算法(Leetcode 33,34,36)

33.搜索旋转排序数组

public int search(int[] nums, int target) {
        if(nums == null || nums.length == 0) {
            return -1;
        }
        int left = 0;
        int mid = 0;
        int right = nums.length - 1;
        while(left <= right) {
            mid = (left + right) >> 1;
            if(nums[mid] == target) {
                return mid;
            }
            if(nums[left] == nums[mid] && nums[mid] == nums[right]) {
                while(left < mid && nums[left] == nums[mid]) {
                    left ++;
                }
                if(left == mid) {
                    left = mid + 1;
                    continue;
                }
            }else {
                if(nums[left] < nums[mid]) {
                    if(target >= nums[left] && target <= nums[mid]) {
                        right = mid - 1;
                        continue;
                    }else {
                        left = mid + 1;
                        continue;
                    }
                }else if(nums[left] > nums[mid]){
                    if(target >= nums[mid] && target <= nums[right]) {
                        left = mid + 1;
                        continue;
                    }else {
                        right = mid - 1;
                        continue;
                    }
                }else {
                    left = mid + 1;
                }
            }
        }
        return -1;
    }
34. 在排序数组中查找元素的第一个和最后一个位置
public int[] searchRange(int[] nums, int target) {
        int res[] = {-1,-1};
        if(nums == null || nums.length == 0) {
            return res;
        }
        res[0] = f(nums,target);
        res[1] = g(nums,target);
        return res;
    }
    public int f(int nums[],int target) {
        int left = 0;
        int right = nums.length - 1;
        int mid = 0;
        int ans = -1;
        while(left <= right) {
            mid = (left + right) >> 1;
            if(nums[mid] > target) {
                right = mid - 1;
            }else if(nums[mid] < target) {
                left = mid + 1;
            }else {
                ans = mid;
                right = mid - 1;
            }
        }
        return ans;
    }
    public int g(int nums[],int target) {
        int left = 0;
        int right = nums.length - 1;
        int mid = 0;
        int ans = -1;
        while(left <= right) {
            mid = (left + right) >> 1;
            if(nums[mid] > target) {
                right = mid - 1;
            }else if(nums[mid] < target) {
                left = mid + 1;
            }else {
                ans = mid;
                left = mid + 1;
            }
        }
        return ans;
    }
36.有效的数独
public boolean isValidSudoku(char[][] board) {
        boolean row[][] = new boolean[9][10];
        boolean col[][] = new boolean[9][10];
        boolean ge[][] = new boolean[9][10];
        for(int i = 0;i < 9;i ++) {
            for(int j = 0;j < 9;j ++) {
                if(board[i][j] != '.') {
                    int num = board[i][j] - '0';
                    int k = 3 * (i / 3) + j / 3;
                    if(row[i][num] || col[j][num] || ge[k][num]) {
                        return false;
                    }
                    row[i][num] = true;
                    col[j][num] = true;
                    ge[k][num] = true;
                }
            }
        }
        return true;
    }
posted @ 2022-01-04 16:35  现在开始努力  阅读(30)  评论(0)    收藏  举报