【剑指offer】数组中的逆序对

【解题思路】

参照 --归并排序 

在前半部分和后半部分合并的时候,通过判断两个数组的最后位置数值的大小进行逆序对查找

firstHale[fst_end]>secHalf(sec_end)  说明对于firstHale[fst_end],后半部分数组都与之构成逆序对,直接压栈该数值对,

否则:

指向secHalf 的指针向前移动一步。

//temp 每次将比较结果中大的那个数字放入其中


【实现代码】

package offerExam;
import java.util.ArrayList;

class Pair{
	int bef;
	int beh;
	public Pair() {
		// TODO Auto-generated constructor stub
	}
}

public class InversePair {
public static void main(String[] args){
	ArrayList pairList=new ArrayList();
	int[] array={7,7,9,7,7};
	inversePair(array,pairList);
	System.out.println("there are "+pairList.size()+" pairs");
	print(pairList);
	
}
private static void print(ArrayList pairList) {
	// TODO Auto-generated method stub
	if(pairList==null||pairList.isEmpty())
		{
		System.out.println("pairlist does not exist");
		return ;
		}
	for(int i=0;i pairList) {
	// TODO Auto-generated method stub
	if(array==null||array.length<=1||pairList==null)
		return;
	int fstLength=array.length/2;
	int[] fstHalf=new int[fstLength];
	System.arraycopy(array, 0, fstHalf, 0, fstLength);
	inversePair(fstHalf, pairList);
	
	int secLength=array.length-array.length/2;
	int[] secHalf=new int[secLength];
	System.arraycopy(array, fstLength, secHalf, 0, secLength);
	inversePair(secHalf, pairList);
	
	int[] temp=new int[array.length];
	generatePair(fstHalf,secHalf,pairList,temp);
	System.arraycopy(temp, 0, array, 0, array.length);
	
	
}

private static void generatePair(int[] fstHalf, int[] secHalf, ArrayList pairList, int[] result) {
	// TODO Auto-generated method stub
	int fst=fstHalf.length-1;
	int sec=secHalf.length-1;
	int res=result.length-1;
	while(fst>=0&&sec>=0){
		
		if(fstHalf[fst]>secHalf[sec]){
			
			result[res--]=fstHalf[fst];
			
			addPair(fstHalf,fst,secHalf,sec,pairList);	
			fst--;
		}
	
		else{
			result[res--]=secHalf[sec];
			sec--;
			
		}
		
	}
	if(sec<0&&fst>=0)
	{
		for(int i=fst;i>=0;i--)
			result[res--]=fstHalf[i];
		
	}
	else if(sec>=0&&fst<0){
		for(int i=sec;i>=0;i--)
			result[res--]=secHalf[i];
	}
	
}

private static void addPair(int[] fstHalf, int fst, int[] secHalf, int sec, ArrayList pairList) {
	// TODO Auto-generated method stub
	//将fstHalf 在fst中元素与secHalf 在索引0~sec之间的元素构成反转逆序对
	for(int i=sec;i>=0;i--)
	{
		Pair newPair=new Pair();
		newPair.bef=fstHalf[fst];
		newPair.beh=secHalf[i];
		pairList.add(newPair);
	}
}
}


你可能感兴趣的:(剑指offer)