163. Unique Binary Search Trees、47. Majority Element II

描述

  • Given n, how many structurally unique BSTs (binary search trees) that store values 1…n?
  • 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一

解决

  • 对于从1~n中的一个值k,将其作为root
  • 由于二叉搜索树的特性:大于k的在右边,小于k的在左边
  • 因此实际情况是可以计算得到:Dj[k-1]*Dj[n-k]
public class Solution {
    /**
     * @param n: An integer
     * @return: An integer
     */
    public int numTrees(int n) {
        // write your code here
        if (n == 0)
        return 1;
        int[] Dj = new int[n+1];
        int ans = 0;
        Dj[0] = 1;
        for (int i = 1; i <= n ;i ++ ){
            Dj[i] = 0;
            for (int j = 1; j <= i; j ++){
                Dj[i] += Dj[i-j]*Dj[j-1];
            }
        } 
        return Dj[n];
    }
}

  • 同一个数组中不可能出现3个主元素
  • HashMap记录下出现的个数
  • 然后对所有记录进行逐步遍历
public class Solution {
    /*
     * @param nums: a list of integers
     * @return: The majority number that occurs more than 1/3
     */
    public int majorityNumber(List<Integer> nums) {
        // write your code here
        Map<Integer,Integer> Helper = new HashMap<Integer,Integer>();
        for (int i = 0;i < nums.size();i++){
            if (Helper.get(nums.get(i)) == null){
                Helper.put(nums.get(i),1);
            } else {
                Helper.put(nums.get(i),Helper.get(nums.get(i)) + 1);
            }
        }
        for (Map.Entry<Integer, Integer> entry : Helper.entrySet()) {
            if (entry.getValue() > nums.size() / 3 )
                return entry.getKey();
        }
        return -1;
    }
}

这是适用于的,但是空间复杂度不符合要求

  • 使用两个数字用于记录出现频率最多的两个
  • 遍历一次数组,找到实际出现频数进行比较即可
public class Solution {
    /*
     * @param nums: a list of integers
     * @return: The majority number that occurs more than 1/3
     */
    public int majorityNumber(List<Integer> nums) {
        // write your code here
        // Map<Integer,Integer> Helper = new HashMap<Integer,Integer>();
        // for (int i = 0;i < nums.size();i++){
        //     if (Helper.get(nums.get(i)) == null){
        //         Helper.put(nums.get(i),1);
        //     } else {
        //         Helper.put(nums.get(i),Helper.get(nums.get(i)) + 1);
        //     }
        // }
        // for (Map.Entry<Integer, Integer> entry : Helper.entrySet()) {
        //     if (entry.getValue() > nums.size() / 3 )
        //         return entry.getKey();
        // }
        // return -1;
        if(nums.size()==1) {
            return nums.get(0);
        }

        int m1 = nums.get(0);
        int m2 = 0;

        int c1 = 1;
        int c2 = 0;

        for(int i=1; i<nums.size(); i++) {
            int x = nums.get(i);
            if(x==m1) ++c1;
            else if(x==m2) ++c2;
            else if(c1==0) {
                m1 = x;
                c1 = 1;
            } else if(c2==0) {
                m2 = x;
                c2 = 1;
            } else {
                --c1; --c2;
            }
        }
        c1 = 0; c2 = 0;
        for(int i=0; i<nums.size(); i++) {
            if(m1 == nums.get(i)) ++c1;
            else if(m2 == nums.get(i)) ++c2;
        }
        if(c1>nums.size()/3) return m1;
        if(c2>nums.size()/3) return m2;
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值