【58同城2017年笔试题】找到局部有序的数组的最小值,复杂度为O(logn)

本文主要是介绍【58同城2017年笔试题】找到局部有序的数组的最小值,复杂度为O(logn),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

对升序的排列的整数数组连续取前N个元素进行逆序排列,得到局部有序的数组,如:

【1,2,3,4,5,6】->【4,3,2,1,5,6】

假设数组元素无重复,从这种局部有序的数组中找到最小值,要求时间复杂度小于O(n),空间复杂度为O(1)

解题思路:

①找到数组的中间位置mid的值,将mid的左右两边的值进行比较;
②取mid和左右两边比较的小的一边,舍弃另一边;
③直到在限定范围内的数只有两个的时候,小的那个就是最小值

就拿【4,3,2,1,5,6】为例,①mid=2位置的值为2,比较其左右两边的值;②右边小,那么舍弃左边,保留右边为【2,1,5,6】;重复第一二步,为【2,1】;

③那么小的那个即为最小值,为1
这种策略的算法复杂度为O(logn),空间复杂度为O(1),满足题目要求。

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);while(in.hasNext()){String str= in.nextLine();String[] str1 = str.split(" ");int[] arr= new int[str1.length];for(int i=0; i<arr.length; i++){arr[i] = Integer.parseInt(str1[i]);}int ret = findMin(arr, arr.length);System.out.println("最小的数为:" + ret);}}static int findMin(int arr[], int arrLen){int min = 0;int i=0, j=arrLen-1, mid=(arrLen-1)/2;while(j-i>1){// 舍弃前半段if(arr[mid-1] > arr[mid+1]){i=mid;}else if(arr[mid-1] < arr[mid+1]){// 舍弃后半段j=mid;}mid = (i + j)/2;}if(arr[i]>arr[j])min=arr[j];elsemin=arr[i];return min;}
}




这篇关于【58同城2017年笔试题】找到局部有序的数组的最小值,复杂度为O(logn)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/601401

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

poj 3258 二分最小值最大

题意: 有一些石头排成一条线,第一个和最后一个不能去掉。 其余的共可以去掉m块,要使去掉后石头间距的最小值最大。 解析: 二分石头,最小值最大。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <c

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述