53. Maximum Subarray

第一遍C & C++

Posted by heroydx on March 7, 2018

题目分析

题目要找出一个数列中,和最大的子数列。

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],

the contiguous subarray [4,-1,2,1] has the largest sum = 6.

乍一看想到的是先遍历数列来寻找所有的子数列并求和,同时比较和的大小。但是这个方法的效率太低了。

编程实现

C实现

int maxSubArray(int* nums, int numsSize) {
    int sum = 0;    //初始化sum
    int max = INT_MIN;    //初始话max为int型的最小值
    for(int i = 0; i < numsSize; i++)
    {
        if(sum >= 0)
            sum += nums[i];    //如果sum为正则加nums[i]
        else
            sum = nums[i];    //如果sum为负则用num[i]替代sum
        if(sum > max)
            max = sum;
    }
    return max;
}

C++实现

这里用到了容器

size_t较为陌生。它是一种“整型”类型,里面保存的是一个整数,就像int, long那样。这种整数用来记录一个大小(size)。size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型。因为size_t类型的数据其实是保存了一个整数,所以它也可以做加减乘除,也可以转化为int并赋值给int类型的变量。 它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。

例如:bitset的size操作返回bitset对象中二进制位中1的个数,返回值类型是size_t。

例如:在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t。vector使用的下标实际也是size_t,源码是typedef size_t size_type。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if (nums.size() == 0) return 0;
        else if (nums.size() == 1) return nums.at(0);
        
        int int_local_max = nums.at(0), int_global_max = nums.at(0);
        size_t sz_length  = nums.size();
        for (size_t i = 1; i != sz_length; ++i) {
            int_local_max  = max(int_local_max + nums.at(i), nums.at(i));
            int_global_max = max(int_local_max, int_global_max);
        }
        
        return int_global_max;
    }
};

总结反思

参考

std::size_t

size_t 这个类型的意义是什么?

size_t 百度百科