Chap5: question: 29 - 31
29. 数组中出现次数超过一半的数字.
方法a. 排序取中 O(nlogn).
方法b. partition 函数分割找中位数 >=O(n).
方法c. 设计数变量,扫描一遍。 O(n).
#include <stdio.h>
int getNumber(int data[], int length){
/* if(checkInvalidArray(data, length)) return 0; */
int count = 1, value = data[0];
for(int i = 1; i < length; ++i)
{
if(count == 0){
value = data[i];
}else if(data[i] == value){
++count;
}else
--count;
}
return value;
}
int main(){
int numbers[] = {2, 2, 2, 2, 6, 6, 6, 6, 6};
int value = getNumber(numbers, sizeof(numbers) / 4);
/* if(value != 0 || !checkInvalidArray(data, length)) */
printf("%d\n", value);
return 0;
}

30. 最小的 k 个数
a. partition 函数找到第 k 个数. >=O(n)
#include <stdio.h>
int partition(int data[], int low, int high){
int value = data[low];
while(low < high){
while(low < high && data[high] >= value) --high;
data[low] = data[high];
while(low < high && data[low] <= value) ++low;
data[high] = data[low];
}
data[low] = value;
return low;
}
void getKNumber(int input[], int length, int out[], int k){
if(!input || !out || length < 1 || k > length || k < 1) return;
int low = 0, high = length - 1, index;
do{
index = partition(input, low, high);
if(index < k-1) low = index + 1;
else if(index > k-1) high = index - 1;
}while(index != k-1);
for(int i = 0; i < k; ++i)
out[i] = input[i];
}
int main(){
int numbers[10] = {3, 5, 2, 6, 7, 4, 9, 1, 2, 6};
int k = 5;
getKNumber(numbers, 10, numbers, k);
for(int i = 0; i < k; ++i)
printf("%-3d", numbers[i]);
printf("\n");
return 0;
}

b. 构造k 个元素的大顶堆
#include <stdio.h>
void HeapAdjust(int data[], int endIndex, int father){
if(!data || endIndex < 0 || father > endIndex || father < 0) return;
int value = data[father]; // set data[0] to save the value of original father
for(int child = 2*father+1; child <= endIndex; child = 2*father+1){
if(child < endIndex && data[child] < data[child+1]) ++child;
if(data[child] < value) break;
else data[father] = data[child];
father = child;
}
data[father] = value;
}
void getKNumber(int input[], int length, int out[], int k){
if(!input || !out || length < 1 || k > length || k < 1) return;
for(int i = 0; i < k; ++i)
out[i] = input[i];
for(int i = k/2-1; i >= 0; --i)
HeapAdjust(out, k-1, i);
for(int i = k; i < length; ++i){
if(input[i] < out[0]){
out[0] = input[i];
HeapAdjust(out, k-1, 0);
}
}
}
int main(){
int numbers[10] = {3, 5, 2, 6, 7, 4, 9, 1, 2, 6};
enum{ k = 1};
int out[k+1] = {0};
getKNumber(numbers, 10, out, k);
for(int i = k-1; i >= 0; --i){
int tem = out[i];
out[i] = out[0];
out[0] = tem;
printf("%-3d", out[i]);
HeapAdjust(out, i-1, 0); // DESC
}
printf("\n");
return 0;
}

31. 连续子数组的最大和
#include <stdio.h>
bool Invalid_Input = false;
int getKNumber(int data[], int length){
Invalid_Input = false;
if(data == NULL || length < 1) {
Invalid_Input = true;
return 0;
}
int maxSum = 0x80000000;
int curSum = 0;
for(int i = 0; i < length; ++i){
if(curSum < 0) curSum = data[i];
else curSum += data[i];
if(curSum > maxSum) maxSum = curSum;
}
return maxSum;
}
int main(){
int numbers[] = {1,-2, 3, 10, -4, 7, 2, -5, -2, 4, -5, 4};
int maxSum = getKNumber(numbers, sizeof(numbers)/4);
if(!Invalid_Input)
printf("%d\n", maxSum);
return 0;
}

Chap5: question: 29 - 31的更多相关文章
- Chap5: question 35 - 37
35. 第一个只出现一次的字符 char firtNotRepeat(char *s) { if(s == NULL) return 0; int i = 0; while(s[i] != '\0') ...
- [C++]3-1 得分(Score ACM-ICPC Seoul 2005,UVa1585)
Question 习题3-1 得分(Score ACM-ICPC Seoul 2005,UVa1585) 题目:给出一个由O和X组成的串(长度为1~80),统计得分. 每个O的分数为目前连续出现的O的 ...
- 29. Divide Two Integers - LeetCode
Question 29. Divide Two Integers Solution 题目大意:给定两个数字,求出它们的商,要求不能使用乘法.除法以及求余操作. 思路:说下用移位实现的方法 7/3=2, ...
- 2016 Google code jam 答案
二,RoundC import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundE ...
- 1Z0-050
QUESTION 13 View the Exhibit.Examine the following command that is executed for the TRANSPORT table ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q29-Q31)
Question 29 You are designing a SharePoint 2010 intranet site at your company. The accounting depart ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q28-Q31)
Question28You have a Microsoft Office SharePoint Server 2007 site.You upgrade the site to SharePoint ...
- HDOJ 1164 Eddy's research I(拆分成素数因子)
Problem Description Eddy's interest is very extensive, recently he is interested in prime number. Ed ...
- hdu1079 Calendar Game
Calendar Game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
随机推荐
- samba服务--路径太深问题-转
- vim常用命令总结 (转)
vim 选择文本,删除,复制,粘贴 文本的选择,对于编辑器来说,是很基本的东西,也经常被用到,总结如下: v 从光标当前位置开始,光标所经过的地方会被选中,再按一下v结束. V 从光标 ...
- Notes of learning AutoLayout
在XCode5中,如果我们添加一个Button或者Label,或者其他的什么标准View,而不设置任何constraints,IB会自动生成constraints,而这些constraints是fix ...
- C# winform程序如何打包64位安装程序
故事背景: 原来在客户电脑上工作的很正常的程序,在客户将其操作系统从32位换为64位之后,出现了不能正常使用的问题. --------------------------- 解决办法: 1:将解决方案 ...
- Python OpenCV —— Arithmetic
图案的算术操作. # -*- coding: utf-8 -*- """ Created on Wed Sep 28 11:54:47 2016 @author: Adm ...
- exec函数族,守护进程,线程同步和互斥
2015.3.2 进程和程序有三点不同:1,存在位置不同,程序:硬盘,磁盘.进程:内存2. 程序是静态的,进程是动态的 执行./a.out -->bash->bash程序调用fork()- ...
- Unity Sprite转Prefab
新项目使用Unity5.X,遇到了一些问题,其中就有Sprite的管理更新问题,查了一些资料,Mono推荐的是转为Prefab处理. 看了一些国外同行的处理方法,分析了一个编辑器插件脚本.学到了一些技 ...
- PHP 发送与接收流文件
http://blog.csdn.net/fdipzone/article/details/40098169
- android textview显示html问题
我在textivew中填充了html标签后,末尾端总是有2.3个空行.debug也没发现有什么换行符.空格符,后来查了半天html的标签,发现里面有个<div>标签,这个标签的作用是把内容 ...
- UVA 572
这是一道纯正的深度优先搜索题目. 题目要求在有多少个不同的块,而不同块的定义则是,一个块中的任意一点和l另一个块中的任意一点不会相连,而相连的定义则是 在横向.纵向和对角线上相连. #include& ...