编程之美(数组求最大最小值得方法)

 #include <iostream>
    using namespace std;
    #include <assert.h>
    //分治思想求数组最大最小值
    void MaxandMin(int* a,int start,int end,int &Max,int &Min)
    {
      if(end-start<=1)
      {
         if(a[start] > a[end])
    {
      Max = a[start];
      Min = a[end];
    }
    else
    {
      Max = a[end];
      Min = a[start];
    }
    return;
      }
      int RightMax=0;
      int RightMin=0;
      int LeftMax=0;
      int LeftMin=0;
    MaxandMin(a,start,(start+end)/2,LeftMax,LeftMin);
    MaxandMin(a,(start+end)/2+1,end,RightMax,RightMin);

    Max = (RightMax > LeftMax) ? RightMax : LeftMax;
    Min = (LeftMin < RightMin) ? LeftMin : RightMin;
    }
    //暴力方法
    void MaxandMin2(int *a,int len,int &max,int &min)
    {
      //if(a == NULL || len <= 0)
    //  cout<<"error!"<<endl;
      assert(len > 0); //if(真) 程序运行;else 报错&&终止程序
       max=a[0];
       min=a[0];
      for(int i(1);i<=len-1;++i)
      {
        if(max < a[i])
    max = a[i];
    if(min > a[i])
    min = a[i];
      }

    }
    // 遍历一遍数组使得下标为偶数的元素较下标为奇数的元素大,再分别求出最大值和最小值
                //比较次数为3*N/2次
    void MaxandMin3(int *a,int len,int &max,int &min)
    {
      if(a == NULL || len<= 0 )
     return;
      for(int i(0);i<len;i+=2)
      {
         if(i<len && a[i] < a[i+1])
    {
      int temp = a[i+1];
    a[i+1] = a[i];
    a[i] = temp;
    }
      }
      max=a[0];
       for(int j(2);j<len;j+=2)
       {
         if(max < a[j])
    {
      max = a[j];
    }
       }
       min = a[1];
       for(int k(3);k<len;k+=2)
       {
         if(min > a[k])
    {
      min = a[k];
    }
       }
    }

    //
    void MaxandMin4(int *a,int len,int &max,int &min)
    {
       if(len > 0 && a != NULL)
       {
           if(len == 1)
      {
        max = min = a[0];
      }
      if(len == 2)
      {
        if(a[0] > a[1])
    {
      max = a[0];
      min = a[1];
    }
      }

      //
      if(a[0] > a[1])
    {
      max = a[0];
      min = a[1];
    }
      else
      {
        max = a[1];
    min = a[0];
      }
    for(int i(2);i<len;i+=2)
       {
         if(i+1 < len && a[i] > a[i+1])
    {
       if(max < a[i])
    {
    max = a[i];
    }
    if(min > a[i+1])
    {
     min = a[i+1];
    }
    }
    else if(i+1 < len && a[i] < a[i+1])
    {
       if(max < a[i+1])
    {
    max = a[i+1];
    }
    if(min > a[i])
    {
     min = a[i];
    }
    }
    else
    {
    if(max < a[i])
    {
          max = a[i];
    }
        if(min > a[i])
    {
          min = a[i];
    }
    }
       }
     }
    }

    int main()
    {
    int a[10]={1,2,3,4,9,8,7,6,5,0};
    int max=0;
    int min =0;
        MaxandMin(a,0,9,max,min);
    cout<<"max="<<max<<endl<<"min="<<min<<endl;
    MaxandMin2(a,10,max,min);
    cout<<"max="<<max<<endl<<"min="<<min<<endl;
    MaxandMin3(a,10,max,min);
    cout<<"max="<<max<<endl<<"min="<<min<<endl;
    MaxandMin4(a,10,max,min);
    cout<<"max="<<max<<endl<<"min="<<min<<endl;
      return 0;
    }

时间: 2024-10-12 12:02:58

编程之美(数组求最大最小值得方法)的相关文章

编程之美之求二叉树中节点的最大距离

题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 分析:树上分析的很清楚,计算一个二叉树的最大距离有两个情况: 1. 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 2. 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 但是树上的代码使用了额外的节点字段,这里给出我的代码,思路是一样的: struct BinaryTree { int valu

编程之美-数组中最长递增子序列(包括输出)

#include <iostream> #define N 8 using namespace std; int main(){ int a[N]={1,-1,2,-3,4,-5,6,-7}; int lis[N]; int result[N];//结果 for(int i=0;i<N;i++) result[i]=0; for(int i=0;i<N;i++) { lis[i]=1; for (int j=0;j<i; j++) { if( a[i]> a[j] &a

【编程之美】求数组的子数组之和的最大值

一个有N个整数元素的一维数组A[0],A[1],......,A[n-1],这个数组当然有很多子数组,那么子数组的最大值是什么呢? 分析与解法 我们先明确题意: 1. 题目说的子数组,是连续的: 2. 题目只需要求和,并不需要返回子数组的具体位置: 3. 数组中的元素是整数,所以数组可能包含有正整数.零.负整数: 4. 子数组不为空. 解法一:枚举 最简单的办法就是枚举所有的i和j,计算sum[i..j] = A[i]+A[i+1]+...+A[j],遍历所有可能的sum[i..j],找到最大值

编程之美——数组分割

一.题目概述:有一个没有排序,元素个数为2N的正整数数组.要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近.假设数组A[1..2N]所有元素的和是SUM.模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合.显然:S(k, 1) = {A[i] | 1<= i <= k}S(k, k) = {A[1]+A[2]+…+A[k]}S(k, i) = S(k-1, i) U {A[k] + x | x属于S(k-1, i-1) }按照这个递推公式来

编程之美之2.14 求数组的子数组之和的最大值

[题目] 一个有N个整数元素的一维数组(A[0],A[1],A[2],...A[n-1]),这个数组中当然有很多子数组,那么子数组之和的最大值是多少? 该子数组是连续的. 我们先来明确一下题意: (1)子数组意味着是连续的. (2)题目只需要求和,并不需要返回子数组的具体位置. (3)数组的元素是整数,所以数组可能包含正整数,负整数或者零. 举几个例子: 数组:[1,-2,3,5,-3,2]返回8 数组:[0,-2,3,5,-1,2]返回9 数组:[-9,-2,-3,-5,-3]返回8 [解法一

[编程之美] 2.14 求数组的子数组之和的最大值

问题描述:给定一个包含N个整数的数组,求数组的子数组之和的最大值. 这是递归和贪心策略的一个经典问题.现在,对这个问题进行一下总结. 1 明确题意 题目中的子数组要求是连续的,也就是数组中的某个连续部分. 如果数组中都是正整数,直接相加就行.因此,主要是要考虑负数的情况. 2 直接求所有的子数组和 最简单且容易理解的解法是求出所有的子数组和,然后保存最大的和. int MaxSum(int *A, int n) { int maximum = -INF; int sum = 0; int i =

求子数组之和的最大值——编程之美 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]),请使其和最大,怎么办?(书中答

编程算法 - 把数组排成最小的数 代码(C)

把数组排成最小的数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正整数数组, 把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个. 大数转换为字符串, 重载快速排序的比较方法, 进行排序, 最后拼接. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdi

编程之美 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)