N个未排序的随机数,在线性时间内,求这N个数在数轴上相邻两个数的最大值

 1 public class MaxSub
 2 {
 3     public static void main(String[] args)
 4     {
 5         int[] a ={5,7,3,1,6,2};
 6         System.out.println(maxSub(a));
 7
 8     }
 9
10     /**
11      * @用于找出N个随机数在数轴相邻位置的最大差值
12      */
13     public static int maxSub(int[] a)
14     {
15        int min=a[0];//初始化数组的最小值min
16        int max=a[0];//初始化数组的最大值max
17     for (int i = 0; i < a.length; i++)//循环一次找出数轴最大最小值复杂度O(N)
18     {
19        if (a[i] < min)
20          min = a[i];
21        if (a[i] > max)
22          max = a[i];
23     }
24     int[] count = new int[max-min+1];//记录数轴上位置的数组,从min开始到max结束
25     for (int i = 0; i< max-min+1; i++)//初始化坐标轴数组  复杂度为O(max-min+1)和N线性关系
26     {
27        count[i] = 0;
28     }
29     for(int i = 0;i< a.length; i++)//标记数组a在数轴上位置  复杂度为O(N)
30     {
31      count[a[i]-min]++;
32     }
33     int maxSub = 0;//最大差值
34     int tempSub = 1;//数轴上相邻两个数的距离
35     for(int i = 0;i< max-min+1; i++)//根据坐标轴上标记位置找出相邻最大差值maxSub 复杂度为O(max-min+1)
36     {
37       if (count[i]==0)tempSub++;
38       else{
39            if(tempSub>maxSub)
40              {
41               maxSub = tempSub;
42              }
43              tempSub = 1;
44             }
45      }
46     return maxSub;
47     }
48 }

思路:
 复杂度为N找出最大值最小值,然后建立一个长度为最大值减去最小值加1的数组作为坐标轴。
 先初始化数组,数组每一项都为0,然后把原数组遍历, 对count[a[i]-min]++;相当于标记数组在坐标轴上位置,

最后找到相邻非零元素间最远距离即为最大差值

时间: 2024-11-03 14:36:36

N个未排序的随机数,在线性时间内,求这N个数在数轴上相邻两个数的最大值的相关文章

未排序数组中累加和为指定值得最长子数组序列问题

1.题目: 给定一个无序数组,其中元素 可正可负可0,给定一个k,求arr中所有的子数组累加和为k的最长子数组长度. 1 // maxLength.cpp : 定义控制台应用程序的入口点. 2 //未排序数组中累加和为指定值的最长子数组长度 3 //数组元素可正.可负.可0 4 5 #include "stdafx.h" 6 #include<iostream> 7 #include <map> 8 #include <iterator> 9 10

从一个未排序的链表中移除重复项

问题 从一个未排序的链表中移除重复的项? 附, 如果不允许使用临时的缓存,你如何解决这个问题? 分析 如果可以使用额外的存储空间,我们就开一个数组来保存一个元素的出现情况. 对于这种情况,最好的解决方法当然是使用哈希表,但令人非常不爽的是C++标准里是没有 哈希表的(java里有).网上有人用ext下的hash_map,但毕竟不是C++标准里的, 用起来怪怪的,搞不好换个环境就跑不起来了(像Linux和Windows下使用就不一样). 所以,一般用一个数组模拟一下就好了.但,这里要注意一个问题,

一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的 相对顺序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1) 。

#include <iostream> using namespace std; void mSort(int *arr, int iLen) { int i, j, k, tmp; for(i = 0, j = 0; i < iLen; i++) { if (arr[i] < 0) { tmp = arr[i]; for(k = i; k > j; k--) arr[k] = arr[k - 1]; arr[j++] = tmp; } } } int main() { in

链表操作 -- 未排序链表的处理问题

问题: 删除未排序链表中的重复元素. 解答: 1)最朴素的方法就是将链表排序,然后遍历并删除其中的重复元素.这种方法的时间复杂度依赖于排序的过程. 在此,我们要思考一下,找到并且删除链表中的重复元素真的需要排序过程吗? 2)如何才能在不排序的情况下找到重复元素? 最朴素的方法就是处理每个节点的时候,遍历剩余的节点,查看其中是否有重复的元素.这种方法的时间复杂度较高,O(n2). 有没有更好的算法或是数据结构来帮助我们降低这个时间复杂度?这种查找某个元素的存在性问题,可以借助于hash表来快速的实

在未排序的数组中找到第 k 个最大的元素

在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度.思路方法:这道题思路就挺简单的,考查的就是对排序算法的了解.就用排序算法把数组元素按照降序排列,最后返回排序好的数组中下标为k-1的元素即是答

二叉树系列 - 二叉搜索树 - 线性时间内把有序链表转化为BST

引言 本文来自于Google的一道题目: how to merge two binary search tree into balanced binary search tree. how to merge two binary search tree into balanced binary search tree.. Let there be m elements in first tree and n elements in the other tree. Your merge funct

JavaScript获取两个数之间的任意随机数

通过JavaScript的Math.random()方法可以获取0到1之间的任意随机数,那如何获取任意给定的两个数之间的随机数呢?如获取2和5之间的随机数,5和10之间的随机数等. 由于Math.random()函数总是返回0到1之间的一个随机数,我们可以把0看成最小数,把1看成最大数.假设最小数是max,最大数是min,通过下面的公式我们便可得出任意两个数之间的随机数: Math.random() * (max - min) + min 如果使用Math.floor()进行向下舍入操作,则需要

C++在已排序数组中查找和值确定的第一次出现的两个数(要求时间复杂度为o(n))

#include <iostream> using namespace std; //输入一个已经按升序排序过的数组和一个数字, //在数组中查找两个数,使得它们的和正好是输入的那个数字. //要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. //例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11. void Grial(int a[],int x,int y) { int j=x-1; int i=0; while(a[j]&

排序练习题(六):相邻两数最大差值

有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值. 给定一个int数组A和A的大小n,请返回最大的差值.保证数组元素多于1个. 测试样例: [1,2,5,4,6],5 返回:2 public class Gap { public int maxGap(int[] A, int n) { // write code here if(null == A ||n<2) return 0; int min=Integer.MAX_VALUE; int max=Intege