Exemple #1
0
        static void Main(string[] args)
        {
            /*
             * Given an integer array nums, find the contiguous subarray (containing at least one number)
             * which has the largest sum and return its sum.
             * Follow up: If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach,
             * which is more subtle.
             *
             *  Example 1:
             *  Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
             *  Output: 6
             *  Explanation: [4,-1,2,1] has the largest sum = 6.
             *
             *  Example 2:
             *  Input: nums = [1]
             *  Output: 1
             *
             *  Example 3:
             *  Input: nums = [0]
             *  Output: 0
             *
             *  Example 4:
             *  Input: nums = [-1]
             *  Output: -1
             *
             *  Example 5:
             *  Input: nums = [-2147483647]
             *  Output: -2147483647
             *
             *  Constraints:
             *
             *  1 <= nums.length <= 2 * 104
             *  -231 <= nums[i] <= 231 - 1
             */

            int[] nums1 = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };

            int res1 = Solution1.MaxSubArray(nums1);


            int[] nums2 = { -1, 2, 3, -5, 4 };
            int   res2  = Solution2.MaxSubArray(nums2);



            int[] nums3 = { 1 };
            int   res3  = Solution2.MaxSubArray(nums3);
        }
        public static int helper(int[] nums, int left, int right)
        {
            if (left == right)
            {
                return(nums[left]);
            }

            int p = (left + right) / 2;

            int leftSum  = helper(nums, left, p);
            int rightSum = helper(nums, p + 1, right);
            int crossSum = Solution1.crossSum(nums, left, right, p);

            int result = Math.Max(Math.Max(leftSum, rightSum), crossSum);

            return(result);
        }