1.数组中的逆序对
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入
复制
1,2,3,4,5,6,7,0
输出
复制
7
思路: 利用归并排序思想 分而治之
public class Solution {
private int count=0;
public int InversePairs(int [] array) {
if(array == null || array.length <=1){
return 0 ;
}
mergeSort(array, 0, array.length-1);
return count;
}
private void mergeSort(int [] array, int left, int right){
if(left == right){
return;
}
int mid = (left+right)/2;
mergeSort(array, left , mid);
mergeSort(array, mid+1, right);
mergeCore(array, left, mid , right);
}
private void mergeCore(int [] array, int left , int mid ,int right){
int [] temp = new int[right-left+1];
int p1= left;
int p2= mid+1;
int i = 0 ;
while(p1<=mid && p2<= right){
if(array[p1]<=array[p2]){
temp[i++] = array[p1++];
}else{
count = (count+mid-p1+1)%1000000007;
temp[i++] = array[p2++];
}
}
while(p1 <=mid){
temp[i++] = array[p1++];
}
while(p2<=right){
temp[i++] = array[p2++];
}
for(int j = 0 ; j<temp.length; j++){
array[left++] = temp[j];
}
}
}
2.两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共结点。
思路: 分别遍历两个数组 然后计算出长度差n 使用快慢指针
让长度长的链表先走n 步 然后 两个链表再同时往后走
找到相等的节点
这样其实是想办法 从倒数位置相等的位置开始比较 然后同时向后遍历。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1 == null || pHead2 == null){
return null;
}
ListNode p1 = pHead1;
ListNode p2 = pHead2;
int p1Length =0;
int p2Length = 0;
while(p1!=null){
p1Length ++;
p1= p1.next;
}
while (p2!=null){
p2Length ++;
p2 = p2.next;
}
p1 = pHead1;
p2 = pHead2;
if(p1Length<p2Length){
int firstGoStep = p2Length - p1Length;
for(int i =0 ; i<firstGoStep ; i++){
p2 = p2.next;
}
}else{
int firstGoStep = p1Length - p2Length;
for(int i =0 ; i<firstGoStep ; i++){
p1 = p1.next;
}
}
while(p1!=null){
if(p1.val == p2.val){
return p1;
}else{
p1 = p1.next;
p2 = p2.next;
}
}
return null;
}
}