编程之美--2.10

题目描述:求数组的最大值和最小值,并且计算比较次数

思路:

(1)普通思路是遍历一遍,得比较2*N次

(2)分治,具体计算可以参考书上内容,算法时间复杂度是O(logn)

 1 #include <iostream>
 2 #include <queue>
 3 #include <climits>
 4 #include <algorithm>
 5 #include <memory.h>
 6 #include <stdio.h>
 7 using namespace std;
 8
 9 struct res
10 {
11     int mx;
12     int ml;
13 };
14
15 res fun(vector<int> a,int s,int e)
16 {
17     res ans;
18     if(s == e)
19     {
20         ans.ml = a[s];
21         ans.mx = a[s];
22         return ans;
23     }
24     int m = (s+e)>>1;
25     res ans1 = fun(a,s,m);
26     res ans2 = fun(a,m+1,e);
27     ans.ml = min(ans1.ml,ans2.ml);
28     ans.mx = max(ans1.mx,ans2.mx);
29     return ans;
30 }
31
32 int main()
33 {
34     vector<int> a;
35     a.push_back(1);
36     a.push_back(2);
37     a.push_back(3);
38     res tmp = fun(a,0,2);
39     cout<<tmp.ml<<endl;
40     cout<<tmp.mx<<endl;
41     return 0;
42 }

编程之美--2.10

时间: 2024-08-29 09:06:24

编程之美--2.10的相关文章

编程之美 2.10 扩展问题

编程之美 2.10 扩展问题 题目如下: 如果需要找出N个数组中的第二大数,需要比较多少次呢?是否可以使用过类似的分治思想来降低比较的次数呢? 解法一 我们最容易想到的方法就是:我们数组进行排序,取倒数第二个数即为所求.但是比较次数是很高的,不可取. 解法二 用2个中间变量来保存最大值和第二大的值,遍历一次数组即可得到最大值和第二大的值.比较次数为:2*N 实现代码如下: package com.wrh.firstpro; import java.util.Arrays; /* * 寻找数组中的

编程之美 2.10寻找数组中的最大最小值

数组是最简单的一种线性数据结构,当得到一个数组,需要找出最大最小值的时候,通过什么样的方法可以高效的,找出最大最小值呢.对于一个N个整数组成的数组,需要比较多少次呢. 现在有一个N=8的数组{5,6,8,3,7,9,1,2}. 解法一: 将找最大和最小数看成2个独立的问题,分别求解,需要遍历数组2次,共需要2N次操作. 1 #include "iostream" 2 using namespace std; 3 void Search_max_and_min(int* a,int N)

求子数组之和的最大值——编程之美 2.14 扩展问题 正确实现

使用动态规划求最大子数字和: s[i]表示data[i~n-1]以元素i开始的最大子数组和,a[i]表示data[i~n-1]中的最大子数组和 : s[i]=max(s[i+1]+data[i], data[i]); a[i]=max(a[i+1], s[i]); 由于数组s,a递推的时候,都只用到数组的前一个变量,所以可以用滚动数组节省空间. 扩展问题: 1) 如果数组首尾相连,即允许找到一组数字(A[i],···,A[n-1], A[0],···, A[j]),请使其和最大,怎么办?(书中答

编程之美——子数组和最大值

解法一:直接求解下标i~j的子数组和最大值:复杂度O(N^2): 代码如下: 1 #include<iostream> 2 using namespace std; 3 const int INF=1000000; 4 5 int maxSum(int arr[],int n); 6 7 int main() 8 { 9 int arr[7]={-2,5,3,-6,4,-8,6}; 10 cout<<maxSum(arr,7)<<endl; 11 return 0; 1

&lt;&lt;编程之美&gt;&gt; -- 队列中取最大值操作的问题

不得不说编程之美是一本好书,虽然很多题目在做acm中的过程中遇到过,不过还是有很多值得思考的地方 这是今天在编程之美上看到的一个问题,对于栈转化成队列的一个思考 平时都太过依赖c++内函数库中的栈和队列,但是对于他们的扩展我们还是应该自己进行手写栈和队列来实现更简单的算法 题目大意: 假设有这样一个拥有3个操作的队列: 1. EnQueue(v) : 将 v 加入队列 2. DeQueue: 使队列中队首元素删除并返回此元素 3.MaxElement: 返回队列中的最大元素 设计一种数据结构和算

编程之美笔记--第一章游戏之乐--1.2中国象棋将帅问题

后来一版作者又将最后一句改为:”要求在代码中只能使用一个字节存储变量“. 我的解法: package android.zlb.java; /** * * @author zhanglibin * */ public class TestXiangqi { public static void main(String[] args) { for(int i = 11; i < 100; i++) { if(i / 10 % 3 == 1 && (i % 10 == 1 || i % 1

2014-04-19编程之美初赛题目及答案解析

第一题: 描写叙述 一般来说,我们採用针孔相机模型,也就是觉得它用到的是小孔成像原理. 在相机坐标系下,一般来说,我们用到的单位长度,不是"米"这种国际单位,而是相邻像素的长度.而焦距在相机坐标系中的大小,是在图像处理领域的一个很重要的物理量. 如果我们已经依据相机參数,得到镜头的物理焦距大小(focal length),和相机胶片的宽度(CCD width),以及照片的横向分辨率(image width),则详细计算公式为: Focal length in pixels = (ima

【C#的学习旅程】Linq _2015编程之美挑战赛初赛 CodeHunt赛区

序言 2015 编程之美挑战赛·初赛结束了,小伙伴们似乎都在Hihocoder上愉快的玩耍-- 只有我一个人默默地打着Code Hunt-- 啊对了,默默的全题3SP的AK了哟-- 来逐题写下题解和解题源码吧-- (P.S 有什么不好的或者说得不对的地方请告诉我哦,我会立马改正的~(●'?'●)) Section 00 BAIYUN 00.01 Tutorial 教程 点进去会有一个小动画,亲切的告诉你玩法, 新手们可以看看这个哦~~ 00.02 求最值 Math里有这样一个函数,返回a与b之间

编程之美之实时排名算法

首先来看一个实时排名算法 参考文献 某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新.现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名.用户最大规模为2亿:积分为非负整数,且小于100万. 存储结构 首先,我们用一张用户积分表user_score来保存用户的积分信息. 表结构: 示例数据: 下面的算法会基于这个基本的表结构来进行. 算法1:简单SQL查询 首先,我们很容易想到用一条简单的SQL语句查询出积分大于该用户积分的用户数量: select 1 + count(t