博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LintCode] Interval Minimum Number
阅读量:6294 次
发布时间:2019-06-22

本文共 2477 字,大约阅读时间需要 8 分钟。

Problem

Given an integer array (index from 0 to n-1, where n is the size of this array), and an query list. Each query has two integers [start, end]. For each query, calculate the minimum number between index start and end in the given array, return the result list.

Example

For array [1,2,7,8,5], and queries [(1,2),(0,4),(2,4)], return [2,1,5]

Challenge

O(logN) time for each query

Note

这道题目是筛选出Interval数组中的最小值,存入新数组。因此,联想到Segment Tree Build和Segment Tree Query系列的题目,对于Interval的处理,使用线段树是非常有效的方法。之前我们创建的线段树,有maxcount两个properties。参照max这个参数,可以考虑在这道题增加一个min的参数,代表每个结点的最小值。

详细思路见code。

Solution

public class Solution {    public ArrayList
intervalMinNumber(int[] A, ArrayList
queries) { ArrayList
res = new ArrayList
(); if (A == null || queries == null) return res; MinTreeNode root = buildTree(A, 0, A.length-1); for (Interval i: queries) { res.add(getMin(root, i.start, i.end)); } return res; } //创建新的树结构MinTreeNode public class MinTreeNode { int start, end, min; MinTreeNode left, right; public MinTreeNode(int start, int end) { this.start = start; this.end = end; } public MinTreeNode(int start, int end, int min) { this(start, end); this.min = min; } } //创建新的MinTreeNode public MinTreeNode buildTree(int[] A, int start, int end) { if (start > end) return null; //下面四行语句是recursion的主体 if (start == end) return new MinTreeNode(start, start, A[start]); MinTreeNode root = new MinTreeNode(start, end); root.left = buildTree(A, start, (start+end)/2); root.right = buildTree(A, (start+end)/2+1, end); //下面三行语句设置每个结点的min值 if (root.left == null) root.min = root.right.min; else if (root.right == null) root.min = root.left.min; else root.min = Math.min(root.left.min, root.right.min); return root; } //获得最小值min的子程序 public int getMin(MinTreeNode root, int start, int end) { //空集和越界情况 if (root == null || root.end < start || root.start > end) { return Integer.MAX_VALUE; } //最底层条件结构 if (root.start == root.end || (start <= root.start && end >= root.end)) { return root.min; } //递归 return Math.min(getMin(root.left, start, end), getMin(root.right, start, end)); }}

转载地址:http://rxvta.baihongyu.com/

你可能感兴趣的文章
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
我爸和在我们小区里的一位老大爷
查看>>
jQuery使用经验建议
查看>>
程序猿小白应该注意什么
查看>>
Android多线程之ArrayBlockingQueue源码解析
查看>>
分享Hadoop处理大数据工具及优势
查看>>
在Go中构建区块链 第7部分:网络
查看>>
JUC之CountDownLatch的源码和使用场景分析
查看>>
Go实现简单的K-V存储
查看>>
【持续更新】C++中string类使用总结
查看>>
霍夫变换概述和标准霍夫变换
查看>>
iOS 跳转App的二三事
查看>>
PhpStorm+Homestead+Xdebug调试Laravel
查看>>
Promise从入门到精通
查看>>
django 限制匿名用户访问以及重定向
查看>>