力扣1764. 通过连接另一个数组的子数组得到一个数组 java实现

1764. 通过连接另一个数组的子数组得到一个数组

贪心+双指针

今天来聊一道力扣的一道题: 1764. 通过连接另一个数组的子数组得到一个数组

题目要求如图:
1764. 通过连接另一个数组的子数组得到一个数组原题描述
简单一些来说就是有一个二维数组和一个一维数组,一维数组中的子数组要与二维数组中的一维数组完全相同,且对比数组的顺序也要完全相同,且众多子数组中的数据不能出现重复,如果二维数组中的一维数组全部比对成功,返回true,否则返回else;

这里的方法采用了贪心加双指针,用i来控制二维数组中的第几个一维数组groups[i],用k来控制一维数组nums[]的以k个位置为起点的子数组来一 一匹配,有两种情况,若果匹配成功,就让k+groups[i].length,就是让k加上二维数组中第几个一维数组的长度,这样nums[]里的数据就会跳过groups[i].length个长度,就可以做到让数组中的数据不重复,同时i++指向二维数组中下一个一维数组;如果匹配不成功,k++,依然往后找后面的子数组, 如果i或k有一个等于各自数组的长度,就说明走到了末尾,整个循环也可以停止了.

check方法用于检查一位数组与nums里的子数组是否相等

/**
 * 1764. 通过连接另一个数组的子数组得到一个数组
 * 给你一个长度为 n 的二维整数数组 groups ,同时给你一个整数数组 nums 。
 *
 * 你是否可以从 nums 中选出 n 个 不相交 的子数组,使得第 i 个子数组与 groups[i] (下标从 0 开始)完全相同,且如果 i > 0 ,那么第 (i-1) 个子数组在
 * nums 中出现的位置在第 i 个子数组前面。(也就是说,这些子数组在 nums 中出现的顺序需要与 groups 顺序相同)
 *
 * 如果你可以找出这样的 n 个子数组,请你返回 true ,否则返回 false 。
 *
 * 如果不存在下标为 k 的元素 nums[k] 属于不止一个子数组,就称这些子数组是 不相交 的。子数组指的是原数组中连续元素组成的一个序列。
 *
 */
class Solution {
    public boolean canChoose(int[][] groups, int[] nums) {
        int i=0;
        for(int k=0;k<nums.length&&i<groups.length;){
            if (check(groups[i],nums,k)){
                k+=groups[i].length;
                i++;
            }
            else{
                k++;
            }
        }
    return i==groups.length;
    }

    private boolean check(int[] g, int[] nums, int k) {
        if(k+g.length>nums.length){
            return false;
        }
        for(int j=0;j<g.length;j++){
            if(g[j]!=nums[k+j]){
                return false;
            }
        }

        return true;

    }
}

最后附上力扣成功截图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值