首页 > 其他分享 >颜色分类(数组、双指针)、排列序列(递归、数学)、合并区间(数组、排序)

颜色分类(数组、双指针)、排列序列(递归、数学)、合并区间(数组、排序)

时间:2023-04-08 10:32:49浏览次数:35  
标签:right 递归 示例 int nums intervals 数组 new 指针

颜色分类(数组、双指针)

给定一个包含红色、白色和蓝色,一共 n_ _个元素的数组,**原地(https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2:

输入:nums = [2,0,1]
输出:[0,1,2]

示例 3:

输入:nums = [0]
输出:[0]

示例 4:

输入:nums = [1]
输出:[1]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] 为 0、1 或 2

进阶:

  • 你可以不使用代码库中的排序函数来解决这道题吗?
  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

解答:

class Solution {
    public void sortColors(int[] nums) {
        int low = 0, high = nums.length - 1;
        int i = 0;
        while (i <= high) {
            if (nums[i] == 0) {
                int tmp = nums[i];
                nums[i] = nums[low];
                nums[low] = tmp;
                ++low;
                ++i;
            } else if (nums[i] == 1) {
                ++i;
            } else if (i <= high && nums[i] == 2) {
                int tmp = nums[i];
                nums[i] = nums[high];
                nums[high] = tmp;
                --high;
            }
        }
    }
}

排列序列(递归、数学)

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

给定 n 和 k,返回第 k 个排列。

示例 1:

输入:n = 3, k = 3
输出:"213"

示例 2:

输入:n = 4, k = 9
输出:"2314"

示例 3:

输入:n = 3, k = 1
输出:"123"

提示:

  • 1 <= n <= 9
  • 1 <= k <= n!

以下程序实现了这一功能,请你填补空白处内容:

class Solution {
	public String getPermutation(int n, int k) {
		StringBuilder sb = new StringBuilder();
		List<Integer> candidates = new ArrayList<>();
		int[] factorials = new int[n + 1];
		factorials[0] = 1;
		int fact = 1;
		for (int i = 1; i <= n; ++i) {
			candidates.add(i);
			fact *= i;
			factorials[i] = fact;
		}
		k -= 1;
		____________________;
		return sb.toString();
	}
}

解答:

for (int i = n - 1; i >= 0; --i) {
	int index = k / factorials[i];
	sb.append(candidates.remove(index));
	k -= index * factorials[i];
}

合并区间(数组、排序)

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

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

解答:

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> res = new ArrayList<>();
        if (intervals == null) {
            return res.toArray(new int[0][]);
        }
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        int i = 0;
        int left = 0;
        int right = 0;
        while (i < intervals.length) {
            left = intervals[i][0];
            right = intervals[i][1];
            while (i < intervals.length - 1 && right >= intervals[i + 1][0]) {
                i++;
                right = Math.max(right, intervals[i][1]);
            }
            res.add(new int[] { left, right });
            i++;
        }
        return res.toArray(new int[0][]);
    }
}

本文内容到此结束了, 如有收获欢迎点赞

标签:right,递归,示例,int,nums,intervals,数组,new,指针
From: https://blog.51cto.com/zhanjq/6177468

相关文章

  • JavaScript遍历数组用splice方法删除元素,这样写可能有遗漏,你遇到过吗?
    在编写“圳品”信息系统中,有时需要对二维数组中的数据进行筛选并删除一些元素,比如删除二维数组中首个元素为0的行。开始是用for循环访问数组+splice方法删除元素来做:vara=newArray([0,0,0,0],[1,1,1,1],[0,2,2,2],[......
  • 26. 删除有序数组中的重复项 & 80. 删除有序数组中的重复项 II
    力扣题目链接(26)给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重......
  • js数组对象如何改变里面对象键名
    方法二中,怎么就通过改变item,arr的值就直接改变了的呢?在JavaScript中,对象是引用类型,当你将一个对象赋值给一个变量时,实际上是将该对象的引用赋值给了变量,而不是复制了该对象本身letobj={name:'jack',age:23}letobj_son=obj;obj_son.name='tome'console.log(obj......
  • 一维数组的应用举例
    案例1从键盘读入学生成绩,找出最高分,并输出学生成绩等级成绩>=最高分-10等级为’A’成绩>=最高分-20等级为’B’成绩>=最高分-30等级为’C’其余等级为’D’提示:先读入学生人数,根据人数创建int数组,存放学生成绩。publicstaticvoidScoreTest(){//提示......
  • LeetCode习题——在排序数组中查找元素的第一个和最后一个位置(二分查找)
    在排序数组中查找元素的第一个和最后一个位置力扣链接:在排序数组中查找元素的第一个和最后一个位置题目给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你......
  • 数组遍历方法: map、filter、forEach
    区别map叫映射,可以重新赋值,拼接用+号,值+另外的值得新值filter叫筛选数组,可以重新赋值,用><=号,比较筛选值forEach叫跟for循环一样,不可以重新赋值......
  • 1250. 检查「好数组」
    题目链接:1250.检查「好数组」方法:最大公约数gcd裴蜀定理简介(1)若\(a,b\)是整数,且\(gcd(a,b)=d\),那么对于任意的整数\(x,y\),\(ax+by\)都一定是\(d\)的倍数,特别地,一定存在整数\(x,y\),使\(ax+by=d\)成立。(2)推论:\(a,b\)互质gcd(a,b)=1的充分必要条件是存在整数\(x,y\)......
  • 解构赋值(数组与对象都能解构赋值)
    ?就是左边有多个变量名对应赋值给右边的多个值数组的解构赋值还可以实现不用新建空变量名,完成相互换值操作可以给左边的变量名设置默认值,有则选对应,无则选默认值对象的解构赋值数组套对象的解构赋值多级对象解构拿里面对象的值(对象套对象)notice,拿数据的时候,可......
  • C-多级指针
    多级指针inta=13;int*p0=&a;int**p1=&p0;printf("%p\n",p0);//a的地址printf("%d\n",*p0);//13printf("%p\n",p1);//p0的地址printf("%p\n",*p1);//a的地址printf("%d\n",**p1);......
  • JS遍历数组的几种方法
    在JavaScript中,遍历数组有多种方法,下面介绍几种经典方法。for循环用for循环遍历数组是最基础、最原始的方法。constarr=[1,2,3,4,5];for(leti=0;i<arr.length;i++){console.log(arr[i]);}forEach()forEach()是ES5中新增的方法,用来遍历数组,可......