递归和分治

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012292754/article/details/87521217

1 分治(Divde & Conquer

2 Pow(x,n)

https://leetcode.com/problems/powx-n/description/

  • 思路1: 暴力解法:O(n)
  • 思路2: 分治
public double myPow(double x, int n) {
        if (n == 0) {
            return 1;
        }

        if (n < 0) {
            if (n == Integer.MIN_VALUE) {
                n = Integer.MAX_VALUE - 1;
            }else{
                n = -n;
            }

            x = 1 / x;
        }

        if (n % 2 == 0) {
            return myPow(x * x, n / 2);
        } else {
            return x * myPow(x * x, n / 2);
        }

    }

    public double myPow_2(double x, int n) {

        double temp = x;
        if (n == 0) {
            return 1;
        }

        temp = myPow_2(x, n / 2);

        if (n % 2 == 0) {
            return temp * temp;
        } else {
            if (n > 0) {
                return x * temp * temp;
            } else {
                return (temp * temp) / x;
            }
        }

    }

3 求众数

https://leetcode.com/problems/majority-element/description/

  • 思路1: 暴力解法:O(N^2)
  • 思路2: Map, O(N)
  • 思路3: 排序 O(N logN)
  • 思路4: 分治 O(N logN)

  • 暴力解法
 public int majorityElement(int[] nums) {

        int majorityCount = nums.length / 2;

        for (int num : nums) {
            int count = 0;

            for (int e : nums) {
                if (e == num) {
                    count++;
                }
            }

            if(count > majorityCount){
                return count;
            }
        }

        return -1;

    }
  • HashMap
  private Map<Integer, Integer> countNums(int[] nums) {
        Map<Integer, Integer> counts = new HashMap<>();

        for (int num : nums) {
            if (!counts.containsKey(num)) {
                counts.put(num, 1);
            } else {
                counts.put(num, counts.get(num) + 1);
            }
        }

        return counts;
    }

    public int majorityElement_2(int[] nums) {
        Map<Integer, Integer> counts = countNums(nums);

        Map.Entry<Integer, Integer> majorityEntry = null;

        for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
            if(majorityEntry == null || entry.getValue() > majorityEntry.getValue()){
                majorityEntry = entry;
            }
        }

        return majorityEntry.getKey();
    }
  • 排序
public int majorityElement_3(int[] nums) {

        Arrays.sort(nums);

        return nums[nums.length / 2];
    }

  • 分治
private int countInRange(int[] nums, int num, int lo, int hi) {
        int count = 0;

        for (int i = lo; i <= hi; i++) {
            if (nums[i] == num) {
                count++;
            }
        }

        return count;
    }

    private int majEleRec(int[] nums, int lo, int hi) {
        if (lo == hi) {
            return nums[lo];
        }

        int mid = (hi - lo) / 2 + lo;
        int left = majEleRec(nums, lo, mid);
        int right = majEleRec(nums, mid + 1, hi);

        if (left == right) {
            return left;
        }

        int leftCount = countInRange(nums, left, lo, hi);
        int rightCount = countInRange(nums, right, lo, hi);

        return leftCount > rightCount ? left : right;

    }

    public int majorityElement_4(int[] nums) {
        return majEleRec(nums, 0, nums.length - 1);
    }

猜你喜欢

转载自blog.csdn.net/u012292754/article/details/87521217