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 ...
随机推荐
- CentOS修改默认编码为UTF-8,使java程序字符集默认为UTF-8
java程序在本地接受php的utf8字符串好好的,到了服务器就行了. 解决,修改vi /etc/sysconfig/i18n,修改之后ssh断开,重连后KILL你的java. LANG=" ...
- IT公司100题-32-交换元素,使数组差最小
问题描述: 有两个整数序列a, b,大小都为n, 序列元素的值任意整数,无序. 要求:通过交换a, b 中的元素,使得sum(a)-sum(b),差最小. 例如: var a=[80, 40, 60, ...
- C++ STL算法系列2---find ,find_first_of , find_if , adjacent_find的使用
一.find运算 假设有一个int型的vector对象,名为vec,我们想知道其中是否包含某个特定值. 解决这个问题最简单的方法时使用标准库提供的find运算: 1 // value we'll lo ...
- Jmeter—2 http请求—简单的get请求
发送一个简单的get http请求 1 启动Jmeter,在测试计划上点击鼠标右键>添加>Threads(Users)>线程组 2 线程组界面.可设置线程数,几秒启动所有线程,循环次 ...
- 在Mac OSX 10.10 上安装opencv
http://blog.csdn.net/wdkirchhoff/article/details/41910553 在Mac OSX上如果想使用OpenCV,可以通过自己手动编译源码的方式,但比较繁琐 ...
- windows核心编程---第五章 线程的基础
与前面介绍的进程一样,线程也有两部分组成.一个是线程内核对象.它是一个数据结构,操作系统用它来管理线程以及用它来存储线程的一些统计信息.另一个是线程栈,用于维护线程执行时所需的所有函数参数和局部变量. ...
- MQTT实现长连接,IM最简单实例
1,引入MqttSDK. 2, 头文件 #import "MQTTSession.h" //定义主题#define kTopic @"lichanghong"/ ...
- MxNet下训练alexnet(一)
1.图像经过工具包中的 make_lsit im2rec 转换为可调用各式.rec,.bin都可以 2.然后使用train_imageXXXX进行训练,参数需要对应 3.利用保存的模型进行估计,测试 ...
- Jquery 读取表单选中值
1.获取复选框的选中值 <title> JS 获取复选框选中的值</title> <script src="jquery-1.11.2.min.js" ...
- pyhton 27 pip命令无法使用 没有Scripts文件夹 的解决方法
1 安装了setuptools http://jingyan.baidu.com/article/fb48e8be52f3166e622e1400.html 2 用ez_setup.py安装了setu ...