• 逆序对,暴力破解


     public int reversePairs(int[] nums) {
            int cnt = 0;
            int len = nums.length;
            for (int i = 0; i < len - 1; i++) {
                for (int j = i + 1; j < len; j++) {
                    if (nums[i] > nums[j]) {
                        cnt++;
                    }
                }
            }
            return cnt;
        }

    归并方式:

     public int reversePairs(int[] nums) {
            int len = nums.length;
    
            if (len < 2) {
                return 0;
            }
    
            int[] copy = new int[len];
            for (int i = 0; i < len; i++) {
                copy[i] = nums[i];
            }
    
            int[] temp = new int[len];
            return reversePairs(copy, 0, len - 1, temp);
        }
    
        /**
         * nums[left..right] 计算逆序对个数并且排序
         *
         * @param nums
         * @param left
         * @param right
         * @param temp
         * @return
         */
        private int reversePairs(int[] nums, int left, int right, int[] temp) {
            if (left == right) {
                return 0;
            }
    
            int mid = left + (right - left) / 2;
            int leftPairs = reversePairs(nums, left, mid, temp);
            int rightPairs = reversePairs(nums, mid + 1, right, temp);
    
            if (nums[mid] <= nums[mid + 1]) {
                return leftPairs + rightPairs;
            }
    
            int crossPairs = mergeAndCount(nums, left, mid, right, temp);
            return leftPairs + rightPairs + crossPairs;
        }
    
        /**
         * nums[left..mid] 有序,nums[mid + 1..right] 有序
         *
         * @param nums
         * @param left
         * @param mid
         * @param right
         * @param temp
         * @return
         */
        private int mergeAndCount(int[] nums, int left, int mid, int right, int[] temp) {
            for (int i = left; i <= right; i++) {
                temp[i] = nums[i];
            }
    
            int i = left;
            int j = mid + 1;
    
            int count = 0;
            for (int k = left; k <= right; k++) {
    
                if (i == mid + 1) {
                    nums[k] = temp[j];
                    j++;
                } else if (j == right + 1) {
                    nums[k] = temp[i];
                    i++;
                } else if (temp[i] <= temp[j]) {
                    nums[k] = temp[i];
                    i++;
                } else {
                    nums[k] = temp[j];
                    j++;
                    count += (mid - i + 1);
                }
            }
            return count;
        }
  • 相关阅读:
    easyui loadFilter 使用
    控件setText与setValue赋值顺序先后区别
    JS选中和取消选中checkbox
    easyui 解决连弹两个dialog时候,第二个dialog居中问题
    bootstrap基础学习【导航条、分页导航】(五)
    bootstrap基础学习【菜单、按钮、导航】(四)
    sublime设置
    《啊哈!算法》笔记
    《编码的奥秘》笔记
    Effective Objective-C 2.0 — 第14条:理解“类对象“的用意
  • 原文地址:https://www.cnblogs.com/zzq-include/p/13583606.html
Copyright © 2020-2023  润新知