LeetCode--493. 翻转对(java)

原题链接
方法1:暴力双循环(超时)

class Solution {
    public int reversePairs(int[] nums) {
       if(nums == null || nums.length == 0) return 0;
		int count = 0;
		for(int i = 0;i < nums.length - 1;i++) {
			for(int j = i + 1;j < nums.length;j++) {
				//if(nums[i] > 2 * nums[j]) count++; 这种形式会有整型溢出的风险
				if(nums[i] - nums[j] > nums[j] ) count++;
			}
		}
		return count; 
    }
}

方法2:归并排序
选自国际站的高票题解

//归并排序
	public int reversePairs(int[] nums) {
		return mergeSort(nums, 0, nums.length - 1);
    }
	
	private int mergeSort(int[] nums, int s, int e) {//s--start   e--end
		if(s >= e) return 0;
		int mid = s + (e - s) / 2;
		//初始翻转对:左半部分内部 与 右半部分内部 翻转对之和
		int count = mergeSort(nums, s, mid) + mergeSort(nums, mid + 1, e);
		//统计左右两部分之间 的翻转对 
		for(int i = s,j = mid + 1;i <= mid;i++) {
			while(j <= e && nums[i] / 2.0 > nums[j]) j++;
			count += j - (mid + 1);
		}
		Arrays.sort(nums, s, e + 1);//偷懒处理
		return count;
	}
发布了31 篇原创文章 · 获赞 3 · 访问量 2533

猜你喜欢

转载自blog.csdn.net/QinLaoDeMaChu/article/details/104060623
今日推荐