leetcode56.合并区间——学习笔记

题目:力扣icon-default.png?t=M1H3https://leetcode-cn.com/problems/merge-intervals/


方法一:利用冒泡排序

class Solution {
    public int[][] merge(int[][] intervals) {
        //排序
        mysort(intervals);
        //执行
        List path = new ArrayList();
        int left = 0;
        int right = 0;
        while(rightintervals[j][0]){
                    int temp0 = intervals[i][0];
                    int temp1 = intervals[i][1];
                    intervals[i][0] = intervals[j][0];
                    intervals[i][1] = intervals[j][1];
                    intervals[j][0] = temp0;
                    intervals[j][1] = temp1;
                }
            }
        }
    }

}

 leetcode56.合并区间——学习笔记_第1张图片


方法二:利用快速排序 

class Solution {
    public int[][] merge(int[][] intervals) {
        int len = intervals.length;
        //排序
        quickSort(intervals,0,len-1);
        //执行
        List path = new ArrayList();
        int left = 0;
        int right = 0;
        while(right=R){
            return;
        }
        int left = L;
        int right = R;
        int pivot = intervals[left][0];
        while(left=pivot){
                right--;
            }
            if(leftpivot
                int temp0 = intervals[right][0];
                int temp1 = intervals[right][1];
                intervals[right][0] = intervals[left][0];
                intervals[right][1] = intervals[left][1];
                intervals[left][0] = temp0;
                intervals[left][1] = temp1;
            }
            if(left>=right){
                intervals[left][0] = pivot;
            }
        }
        quickSort(intervals,L,right-1);
        quickSort(intervals,right+1,R);
    }

}

leetcode56.合并区间——学习笔记_第2张图片


思路: 方法一和方法二的大致思路是一样的,唯一的区别就是在排序上使用了不同的算法。明显运用快速排序的执行时间比运用冒泡排序的执行时间短了不只是一些。因此,此处详细介绍方法二。排序是为了方便后续的比较操作,我们需要为intervals单独写一个排序方法。排序后,声明两个变量left和right作为指针,声明两个变量min和max表示当前数组的取值范围。然后进入循环,若后者数组的第一位数小于前者数组的最后一位(因为一个数组也就两个数,所以也是第二位),则意味着两者可以合并,因此将max的值修改为 后者数组的最后一位(也是第二位) 与 max 二者中的较大者,min的值不变。反之,意味着两者不可以合并,因此需要先将min和max设置为一个新的数组存入path中,并且将min的值修改为当前的max,重复上述步骤。最后通过一个for循环,将list类型的path转成二维数组返回即可。


1.快速排序。快速排序是一个递归的方法,他的大概思路是在数组中任意选定一个数为pivot(为了方便,此处我统一选定为数组的第一个元素),然后按序遍历pivot左右两边的数组(当数组长度为1时默认有序,不需要操作),发现比pivot大的元素则放置在pivot的右侧(即将当前元素与right指针当前指向的元素换位),发现比pivot小的元素则放置在pivot的左侧(即将当前元素与left指针当前指向的元素换位),先遍历pivot左边的数组,再遍历pivot右边的数组,当左右指针重合时(即数组长度为1时)默认有序,返回。

//快速排序
private void quickSort(int[][] intervals,int L,int R){
    if(L>=R){
        return;
    }
    int left = L;
    int right = R;
    int pivot = intervals[left][0];
    while(left=pivot){
            right--;
        }
        if(leftpivot
            int temp0 = intervals[right][0];
            int temp1 = intervals[right][1];
            intervals[right][0] = intervals[left][0];
            intervals[right][1] = intervals[left][1];
            intervals[left][0] = temp0;
            intervals[left][1] = temp1;
        }
        if(left>=right){
            intervals[left][0] = pivot;
        }
    }
    quickSort(intervals,L,right-1);
    quickSort(intervals,right+1,R);
}

2.准备阶段。用len记录二维数组的产犊;利用上述写的快速排序quickSort对intervals数组进行排序;声明List类型的path,用于记录答案;声明左指针left和右指针right,默认值为0。

int len = intervals.length;
quickSort(intervals,0,len-1);
List path = new ArrayList();
int left = 0;
int right = 0;

3.正式比较。当右指针仍在intervals数组的长度之内,则仍需要继续执行循环。用min记录左指针的值,用max记录右指针的值。当出现某一个数组的第一位小于或等于max时,则证明有合并的情况出现,因此需要修改max的值。用path列表记录下来由min和max组成的新数组,然后修改left的值为right,准备下一轮循环。

while(right

4.格式转化。声明一个新的二维数组ans,长度就是列表path的长度,用一个for循环将已经记录好答案的list类型path转换成二维数组的格式存到ans中去。

int[][] ans = new int[path.size()][2];
    for(int i=0;i

4.将二维数组ans返回即可。

return ans;

你可能感兴趣的:(leetcode,递归算法,快速排序,冒泡排序,java)