当前位置: 首页 > news >正文

字节跳动 —— 建筑物组合(滑动窗口+溢出问题)

原题描述: 

题目精炼

   给定N个建筑物的位置和一个距离D,选取3个建筑物作为埋伏点,找出所有可能的建筑物组合,使得每组中的建筑物之间的最大距离不超过D。最后,输出不同埋伏方案的数量并对99997867取模。

识别问题

   由于此题的建筑物是一个单调递增的数组(单调性),并且使用“同向双指针”来维护一段区间,保证(判断条件):

        1)right - left +1 >= 3
        2)buildings[right] - buildings[left] <= D
        3)right < buildings.length 或者 left < buildings.lengrh - 2

   因此,我们可以使用“滑动窗口”来求解。

滑动窗口解题思路:

1)左右指针初始化

int left = 0;
int right = 2;

2)满足条件进窗口

注意,要先判断right是否小于数组长度,否则会越界

while(right < buildings.length && buildings[right] - buildings[left] <= D){
    right++;
}

3)更新结果

此处涉及到求解组合数量问题,为了防止一段区间内,子集重复的问题,每次以buildings[left]为基准,在剩余的buildings中选取两个进行组合,公式为

C(n, 2) = \binom{n}{2} = \frac{n!}{2!(n-2)!} = \frac{n(n-1)}{2}

但是,此处涉及到两个很大的整数相乘,会出现溢出的问题,因此我们可以使用更大的整数类型,将n*(n-1)转换为long类型,并对每次累加后的结果%99997867 防止溢出。

int n = right - left - 1;
long p =((long)n *(n-1))>>1;
count =(count + p)%99997867;

当因为right>=buildings.length而跳出循环时,说明此时没有更大的值了,收集完结果后要对right--,使得right始终停留在最右边界,从而可以继续判断,等待left缩小窗口

if(right >= buildings.length){
    right--;
}

4)出窗口

left++;

其中,进窗口,更新结果,出窗口是一个不断循环的过程,因此,最终代码为:

import java.util.Scanner;
public class ByteDance_BuildingCombinations {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int D = in.nextInt();
        int[] buildings = new int[N];
        for (int i = 0; i < N; i++) {
            buildings[i] = in.nextInt();
        }
        long count = slide(buildings,D);

        System.out.println(count);
    }

    public static long slide(int[] buildings, int D){
        long count = 0;
        int left = 0;
        int right = 2;

        while(left < buildings.length - 2){
            while(right < buildings.length && buildings[right] - buildings[left] <= D){
                right++;
            }

            int n = right - left - 1;
            long p =((long)n *(n-1))>>1;
            count =(count + p)%99997867;

            if(right >= buildings.length){
                right--;
            }
            left++;
        }
        return count;
    }
}

相关文章:

  • 大白话 Vue 中的keep - alive组件,它的作用是什么?在什么场景下使用?
  • 3ds Max 快捷键分类指南(按功能划分)
  • RabbitMQ从入门到实战-2
  • 深度学习Y1周:调用官方权重进行检测
  • 程序代码篇---STM舵机控制
  • pyecharts制作gdp动态柱形图-学习记录
  • 接口自动化入门 —— Jmeter实现在接口工具中关联接口处理方案
  • 面试之《什么是流式渲染》
  • 11. Pandas :操作Excel文件(Excel报表的案例研究)
  • Python第十八课:目标检测 | 让计算机看懂世界
  • BambuStudio学习笔记:ModelArrange
  • Qt开源控件库(qt-material-widgets)的编译及使用
  • thinkphp download()函数下载中文名文件名乱码
  • HCIP复习拓扑练习(修改版)
  • Qt 6.6.1 中 QPixmap::grabWindow() 的用法与替代方案
  • 【数据分析】有关DataFrame的知识(2)
  • ruoyi-cloud-plus编译记录-1
  • 【Linux】:封装线程
  • AutoGen多角色、多用户、多智能体对话系统
  • Qt 数据库操作(Sqlite)
  • 巴称击落多架印度“阵风”战机,专家:小规模冲突巴空军战力不落下风
  • Neuralink脑接设备获FDA突破性医疗设备认证
  • 长三角铁路今日预计发送386万人次,沪宁、沪杭等方向尚有余票
  • 当一群杜克土木工程毕业生在三四十年后怀念大学的历史课……
  • 马克思主义理论研究教学名师系列访谈|金瑶梅:教师需要了解学生的现实发展,把握其思想发展动态
  • 哈马斯:愿与以色列达成为期5年的停火协议