zoukankan      html  css  js  c++  java
  • 剑指offer系列24:连续子数组的最大和

    初次看到这个题的时候,我觉得很复杂,因为不知道所求的子数组的长度,而且里有负数增加了难度。看了答案之后发现竟然可以用这么简单的算法做出来,答案里说用的是贪心算法。

     1 #include<iostream>
     2 #include<vector>
     3 using namespace std;
     4 class Solution {
     5 public:
     6     int FindGreatestSumOfSubArray(vector<int> array) {
     7         if (array.empty())
     8             return 0;
     9         int sum = 0, maxsum = 0,maxnum=INT_MIN;
    10         for (int i = 0; i < array.size(); i++)
    11         {
    12             //sum = sum + array[i];
    13             sum += array[i];
    14             if (sum < 0)
    15                 sum = 0;
    16             else if (sum > maxsum)
    17                 maxsum = sum;
    18             if (array[i] > maxnum)
    19                 maxnum = array[i];
    20         }
    21         return (maxsum>0)?maxsum:maxnum;
    22     }
    23 };
    24 int main()
    25 {
    26     vector<int> test{ 1,-2,3,10,-4,7,2,-5 };
    27     Solution so;
    28     cout << so.FindGreatestSumOfSubArray(test) << endl;
    29     return 0;
    30 }

    剑指offer上说这个题也可以用动态规划的思路去做,但是代码是一样的。动态规划和贪心算法都是很常考的算法。

    接下来写一个时间复杂度低的算法,总体来讲就是找到规律,用递归的方式去一层一层的解,有点像分治法。

     1 #include<iostream>
     2 #include<string>
     3 //#include <sstream>
     4 using namespace std;
     5 class Solution {
     6 public:
     7     int NumberOf1Between1AndN_Solution(int n)
     8     {
     9         char c[50];
    10         sprintf_s(c, "%d", n);//将数字转成字符串
    11         int re=Find1(c);
    12         return re;
    13     }
    14     int Find1(const char *s)
    15     {
    16         if (!s || *s<'0' || *s>'9' || *s == '')
    17             return 0;
    18         //char first = s[0];
    19         int first = *s - '0';//first需要设置成整型,后面计算需要用到,第一位减去0刚好是他的整型的数
    20         unsigned int length = static_cast<unsigned int>(strlen(s));//强制表达式格式转化
    21 
    22         //递归的结束条件
    23         if (length == 1 &&first==0)//个位是0的时候返回0
    24             return  0;
    25         if (length == 1 && first>0)//个位大于0说明至少有一个1,返回1
    26             return 1;
    27         //char first = s[0];
    28         int highbit = 0, midbit = 0, lowbit = 0;
    29         //最高位为1的个数
    30         //假设数字为21345,将其分为两步分,分别是1346~21345和1~1345
    31         if (first >1)
    32             highbit = powerbase10(length - 1);
    33         else
    34             if(first==1)
    35             {
    36                 highbit = atoi(s + 1) + 1;
    37             }
    38         //21345中除了最高位之外的其余4位为1的数量,排列组合,C4-1,即在四位中挑出一位写上,剩下的位的数字为C10-1
    39         midbit = first*(length-1)*powerbase10(length - 2);
    40 
    41         //1~1345中的1的数目
    42         lowbit = Find1(s+1);
    43 
    44         return highbit + midbit + lowbit;
    45     }
    46     int powerbase10(int n)
    47     {
    48         int re=1;
    49         for (int i = 0; i < n; i++)
    50             re *= 10;
    51         return re;
    52     }
    53 };
    54 int main()
    55 {
    56     Solution so;
    57     cout << so.NumberOf1Between1AndN_Solution(100) <<endl;
    58     return 0;
    59 }
  • 相关阅读:
    elasticsearch 6.x.x 获取客户端方法
    struts2+spring 配置404和500错误页面
    linux 部署redis集群 碰到的坑
    Linux下安装redis
    struts加载spring
    有关struts中DispatchAction的用法小结
    spring AOP原理
    struts2.0的工作原理?
    Spring MVC的实现原理
    spring 的单例模式
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11164369.html
Copyright © 2011-2022 走看看