Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1003627
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2012-12-23 01:09:11

在一个int 数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
 
这个题目到手直观感受是相当于一轮快排。所以对原数组进行快排,完成后的序列和新序列如果值相等,那么说明该数满足条件。
文中的解答如下:
直观想法是用两个数组a、b。a[i]、b[i]分别保存从前到i 的最大的数和从后到i 的最小的数,一个解答:这需要两次遍历,然后再遍历一次原数组,将所有data[i]>=a[i-1]&&data[i]<=b[i]的data[i]找出即可。给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一次。
 
该算法优化仅需不记录最小值数组,只记录当前最小值,并且符合条件直接输出即可
代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX 10000

  4. void getPiv(int *input, int size){
  5.     if(input == NULL) return;
  6.     int max[MAX] = {0};
  7.     int i = 1;
  8.     max[0] = input[0];
  9.     for(;i<size;i++){
  10.         max[i] = max[i-1];
  11.         if(input[i]>max[i])
  12.             max[i] = input[i];
  13.     }
  14.     int min = input[size-1];
  15.     for(i=size-2;i>=0;i--){
  16.         min = min>input[i] ? input[i] : min;
  17.         if(input[i]>=max[i] && input[i]<=min)
  18.             printf("%d \n", input[i]);
  19.     }
  20. }
  21. int main(){
  22.     int input[] = { 1,2,5,3,4};
  23.     getPiv(input, sizeof(input)/sizeof(int));
  24. }

阅读(1720) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~