栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java算法训练第十六天

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java算法训练第十六天

目录

题库一、颜色分类

1.三指针解法(个人想法,遍历数组一次)2.单指针解法(遍历数组两次) 二、合并区间

先排序,再判断


题库 一、颜色分类

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库的sort函数的情况下解决这个问题。
原题

1.三指针解法(个人想法,遍历数组一次)

建立三个指针 red,blue,p ,red指针指向红色元素的末尾,blue指针指向蓝色的开头,p指针用来对数组进行遍历。用p指针访问到元素,如果判断该元素是红色,则放到red指针指向的地址,如果是蓝色,就放到blue指针指向的地址,如果是白色,则访问下一个元素。
代码如下:

public void sortColors(int[] nums) {
        int red = 0,blue = nums.length - 1,p = 0;
		while(p <= blue) {
            while(nums[blue] == 2 && p < blue)
                blue--;
			if(nums[p] == 0) {
				int temp = nums[red];
				nums[red] = nums[p];
				nums[p] = temp;
				red++;
				p++;
			}else {
				if(nums[p] == 2) {
					int temp = nums[blue];
					nums[blue] = nums[p];
					nums[p] = temp;
					blue--;
				}else
					p++;
			}
		}
    }
2.单指针解法(遍历数组两次)

利用一个指针进行两次遍历,第一次遍历把 0 全放到数组前面,用指针记录最后一个 0 的位置,然后第二次遍历把 1 放到 0 的后面。
代码如下:

    public void sortColors(int[] nums) {
        int num = 0;
        for (int i = 0; i < nums.length; ++i) {
            if (nums[i] == 0) {
                int temp = nums[i];
                nums[i] = nums[num];
                nums[num] = temp;
                ++num;
            }
        }
        for (int i = num; i < nums.length; ++i) {
            if (nums[i] == 1) {
                int temp = nums[i];
                nums[i] = nums[num];
                nums[num] = temp;
                ++num;
            }
        }
    }
二、合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
原题

先排序,再判断

由于数组 intervals 里的区间是无序的,所以我们每个访问的元素都要与其它已访问的元素进行比较,这样太过复杂。如果我们按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的。如果两个区间可以合并,那一定满足某个区间的 end 和另一个区间的 start 要小与或等与,这是最关键的条件。具体思路请看以下代码及注释。
代码如下:

    public int[][] merge(int[][] intervals) {
        if(intervals.length == 0)
			return new int[0][2];
		Arrays.sort(intervals,new Comparator() {
			public int compare(int[] interval1,int[] interval2) {
				return interval1[0] - interval2[0];
			}
		});//先对数组进行排序
        int num = 0,pre = 0;//pre指向上一个合并后的大区间,num表示有几个合并后的大区间
		for(int i = 1;i < intervals.length;i++) {
			if(intervals[i][0] <= intervals[pre][1]) {//合并后的大区间仍存储在原数组
                if(intervals[i][1] > intervals[pre][1])
				    intervals[pre][1] = intervals[i][1];
				if(intervals[i][0] < intervals[pre][0])
					intervals[pre][0] = intervals[i][0];
			}else {
				num++;
				pre++;
				intervals[pre] = intervals[i];
			}
		}
		int[][] result = new int[++num][2];//要对num加一
		for(int i = 0;i < num;i++) {
			result[i] = intervals[i];
		}
		return result;
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778320.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号