20200314
题目 :数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
思路 :逆序对是只要当前数字大于之后数字即可,以7564为例:
逆序对:75,76,74,54,64
利用归并排序
class Solution{
int count = 0;
public int reversePairs(int[] nums){
mergeSort(nums,0,nums.length-1);
return count;
}
public void mergeSort(int[] nums, int start, int end){
if(start < end){
int mid = start + ((end - start) >> 1);
mergeSort(nums,start,mid);
mergeSort(nums,mid+1,end);
merge(nums,start,mid,end);
}
}
public void merge(int[] nums, int start, int mid,int end){
int[] temp = new int[end-start+1];
int p1 = start;
int p2 = mid + 1;
int p = 0;
while(p1<=mid && p2<=end){
if(nums[p1] <= nums[p2]){
temp[p++] = nums[p1++];
}else{
count = count + mid-p1+1;
temp[p++] = nums[p2++];
}
}
while(p1 <= mid){
temp[p++] = nums[p1++];
}
while(p2 <= end){
temp[p++] = nums[p2++];
}
for(int i=0;i<temp.length;i++){
nums[i+start] = temp[i];
}
}
}
题目 :两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。
例如:
在节点c1开始相交。
思路
设交集链表长c,链表1除交集的长度为a,链表2除交集的长度为b,有:
- a + c + b = b + c + a
- 若无交集,则a + b = b + a
public ListNode getIntersectionNode(ListNode headA, ListNode headB){
if(headA == null || headB == null){
return null;
}
ListNode h1 = headA, h2 = headB;
while(h1 != h2){
h1 = h1 == null ? headB : h1.next;
h2 = h2 == null ? headA : h2.next;
}
return h1;
}