字节跳动二面 找出最小间断数

题目:给出一个数组,找出最小间断数,例如:[9,1,2,3,5,7,8]  最小间断数为3

最简单一种思路:将数组进行排序,排序后从最左端开始前一个元素与后一个元素相比,找出差不是1的即可,需要排序,时间复杂度就与排序算法相关,

第二种思路:找出数组中最大的一个元素,建立一个长度为该最大值的数组,然后遍历原始的数组,将元素组的值放到新数组中,并且放的下标位置就为元素的值,找到原数组最小的元素值,从该角标开始遍历新数组,若某一个位置的值为0则前一个位置就为所求,这种方式的话时间复杂度为O(n),但是空间复杂度得不到保证,与最大值相关

第三种思路:从第二种思路我们就知道,其实在新建数组中,最小值角标以前的位置我们就没有用到,那就可以将新数组中的所有元素往前移动,每一个元素放的角标不在为该元素的值了,而为该元素的值减去最小元素的值,这样的话就一定程度减小了空间复杂度;伪代码如下:

int[]  result = new int[max-min+1];

for(int i=0;i<array.length;i++){

  result[array[i]-min] = array[i];

}

for(int i=0;i<result.length;i++){

  if(result[i]==0){

    return result[i-1];

  }

}

上面的程序还遗留的有一个问题,若数组中含有0,则判断会有问题,解决方案:

int[]  result = new int[max-min+1];

for(int i=0;i<array.length;i++){

  result[array[i]-min] = array[i]-min;---------存储的值也减去最小值

}

for(int i=1;i<result.length;i++){--------i从1开始,因为第一个位置存的是最小值对应的值,肯定为0

  if(result[i]==0){

    return result[i-1]+min;

  }

}

还有一种解决方案:判断时不判断为0,用后一个数减去前一个数,若结果不为1,则前一个数就是

原文地址:https://www.cnblogs.com/zhaolei1996/p/12275250.html

时间: 2024-08-28 23:50:46

字节跳动二面 找出最小间断数的相关文章

在由N个元素构成的集合S中,找出最小元素C,满足C=A-B,其中A,B是都集合S中的元素,没找到则返回-1

package bianchengti; /* * 在由N个元素构成的集合S中,找出最小元素C,满足C=A-B, * 其中A,B是都集合S中的元素,没找到则返回-1 */ public class findMinValue { //快速排序 public static void sort(int a[], int low, int hight) { if (low > hight) { return; } int i, j, key; i = low; j = hight; key = a[i]

C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

#include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7,2,3,1,6,8,4}; int i=0,j=0; int n = sizeof(a)/4; //外循环n-1轮 for(i=0;i<n-1;i++){ int pos = i;//始终指向最小的位置 for(j=i+1;j<n;j++){ if(a[j]<a[pos]){ pos = j

ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)

1061: 从三个数中找出最大的数Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 124[Submit][Status][Web Board] Description 定义一个带参的宏(或者模板函数),从三个数中找出最大的数. Input 3个短整型数,空格隔开 3个实数,空格隔开 3个长整数,空格隔开 Output 最大的数,对于实数保留2位小数. Sample Input 1 2 3 1.5 4.7 3.2 123456

找出最小的k个数

•已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中实现上述运算? 方法一: 1 //利用最大根堆实现最小k个节点 2 //最大根堆特点:每个节点都比他左右孩子要大 3 //调整最大堆的时间复杂度为O(lnK),因此该算法(问题)时间复杂度为O(nlnK). 4 //思路:通过数组建堆 5 //规律:第i个节点的左孩子为2i+1,右孩子为2i+2 6

数组中找出最小的K个数

题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 1 public static void printKNum(int[] source, int k) {//算法入口 2 if (k <= 0) { 3 System.out.println("请出入合法的K值"); 4 } else if (source.length <= k) {//如果数组的长度小于等于K,则全部输出 5

30 - 找出最小的k个数

题目描述:http://ac.jobdu.com/problem.php?pid=1371 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 第一种思路: 如上一题中,用快速排序中的划分函数,划分元素最终下标index小于K,划分[index+1, n]:划分元素最终下标index大于K,划分[0, index-1]; 找到划分元素下标是K时,停止,此时0 ~ K-1 为最小的K个数 时间复杂度O(n),缺点是会修改原数组

算法试题 - 找出最小 k 个数

题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k),堆是完全二叉树的一种,最大堆就是最上面的数是最大的该方法基于二叉树或者堆来实现,首先把数组前k个数字构建一个最大堆,然后从第k+1个数字开始遍历数组,如果遍历到的元素小于堆顶的数字,那么久将换两个数字,重新构造堆,继续遍历,最后剩下的堆就是最小的k个数,时间复杂度O(nlog k). 思路2 排序

位运算 找出给定的数中其他数都是两个,有两个是一个的数

题目大意: 给定你n个数, 其中有n-2个数都是两两成对的,有两个是单独出现的,如n = 8, 2 3 2 5 3 6 4 6, 这时候4和5是单独的两个,所以答案就是4,5,其中n的范围是1e6. 思路: 之前做过找一个单独的数的题,那个题是用一个比较巧妙的方法来做的,不过这个也是一类经典问题,用到了强大的位运算,有了那个题的基础再来做这个题就简单了.(附:找一个的题目链接). 刚开始我是用了O(nlogn)的时间复杂度来做的,先排序,然后用类似找一个的方法找出第二个.我觉得对于1e6的数据量

【基础算法】排序-复杂排序之二(找出第K大的数)

切割的思想是高速排序最精髓的地方.每一次切割出来的元素K一个排在第K位,所以利用这样的思想我们至少知道3点 1. 被切割出来的元素K最后一定排在第K位. 2. 在K左边的元素一定比K小或者相等. 3. 在K右边的元素一定比K大或者相等. 所以我们能够通过这些性质定位到随意一个元素. 比方我们partition完一个数组后,得到A={5,3,4,2,6,8,10,12,11,9} A[K]=8,所以我们知道排好序后的A[5]=8, A[4]一定在8左边,A[6]一定在8右边 所以,我们一定知道8这