剑指offer-20200315

20200315

题目 在排序数组中查找数字|

统计一个数字在排序数组中出现的次数。

思路 :第一眼看去一个hashmap搞定,但是给定的是一个已经排序后的数组,所有采用二分法。

code

class Solution{
    public int search(int[] nums, int target){
        int l = 0;
        int r = nums.length - 1;
        int ans = 0;
        while(l <= r){
            int temp = (l + r) >> 1;
            if(nums[temp] < target){
                l = temp + 1;
            }else if(nums[temp] > target){
                r = temp - 1;
            }else{
                for(int i = temp; i >= 0 && nums[i] == target;i--, ans++);
                for(int i = temp + 1; i < nums.length && nums[i] == target;i++,ans++);
                break;
            }
        }
        return ans;
    }
}

题目 :0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

思路 :利用二分查找,如果当前数字与当前位置相等,则说明前面的数字都没有缺失,接着对后半部分进行查找;

code

class Solution{
    public int missingNumber(int[] nums){
        int low = 0;
        int high = nums.length;
        while(low < high){
            int mid = (low + high) >> 1;
            if(nums[mid] != mid) high = mid;
            else low mid + 1;
        }
        return low;
    }
}

题目 :二叉搜索树的第k大节点

给定一颗二叉搜索树,请找出其中第k大的节点。

示例

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4

思路 :二叉树的一个特性:通过中序遍历得到的序列,是有序的。

当遍历到第K大数的时,停止遍历。

code

class Solution{
    private int ans = 0, count = 0;
    public int kthLargest(TreeNode root, int k){
        helper(root,k);
        return ans;
    }
    
    private void helper(TreeNode root, int k){
        if(root.right != null) helper(root.right, k);
        
        if(++count == k){
            ans = root.val;
            return ;
        }
        if(root.left != null) helper(root.left,k);
    }
}
发布了94 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_31900497/article/details/104873747