import unittestfrom typing import Listdef maxProduct_alternative(nums: List[int]) -> int: """ 找出数组中乘积最大的非空连续子数组 参数: nums: 整数数组 返回: 最大乘积(32位整数) """ if not nums: return 0 cur_max = cur_min = global_max = nums[0] for i in range(1, len(nums)): num = nums[i] # 同时计算三种可能的值 candidates = [num, cur_max * num, cur_min * num] # 更新当前最大和最小值 cur_max = max(candidates) cur_min = min(candidates) # 更新全局最大值 global_max = max(global_max, cur_max) return global_maxclass TestMaxProductAlternative(unittest.TestCase): """测试乘积最大子数组的替代算法""" def test_empty_array(self): """测试空数组""" self.assertEqual(maxProduct_alternative([]), 0) def test_single_element(self): """测试单元素数组""" self.assertEqual(maxProduct_alternative([5]), 5) self.assertEqual(maxProduct_alternative([-3]), -3) self.assertEqual(maxProduct_alternative([0]), 0) def test_all_positive(self): """测试全正数数组""" self.assertEqual(maxProduct_alternative([1, 2, 3, 4]), 24) # 全部相乘 self.assertEqual(maxProduct_alternative([3, 2, 1]), 6) # 3×2=6 def test_all_negative(self): """测试全负数数组""" self.assertEqual(maxProduct_alternative([-2, -3, -4]), 12) # -3×-4=12 self.assertEqual(maxProduct_alternative([-1, -2]), 2) # -1×-2=2 def test_mixed_positive_negative(self): """测试正负数混合数组""" self.assertEqual(maxProduct_alternative([2, 3, -2, 4]), 6) # 2×3=6 self.assertEqual(maxProduct_alternative([-2, 3, -4]), 24) # 3×-2×-4=24 def test_with_zeros(self): """测试包含零的数组""" self.assertEqual(maxProduct_alternative([0, 2]), 2) # 最大为2 self.assertEqual(maxProduct_alternative([2, 0, 3]), 3) # 最大为3 self.assertEqual(maxProduct_alternative([-2, 0, -1]), 0) # 最大为0 def test_leetcode_examples(self): """测试LeetCode官方示例""" # 示例1 self.assertEqual(maxProduct_alternative([2, 3, -2, 4]), 6) # 示例2 self.assertEqual(maxProduct_alternative([-2, 0, -1]), 0) def test_edge_cases(self): """测试边界情况""" # 最小数组 self.assertEqual(maxProduct_alternative([1]), 1) # 包含最小整数 self.assertEqual(maxProduct_alternative([-10]), -10) # 两个元素 self.assertEqual(maxProduct_alternative([-2, 3]), 3) def test_complex_scenarios(self): """测试复杂场景""" # 需要动态更新cur_min的情况 self.assertEqual(maxProduct_alternative([-2, 3, -4]), 24) # 多个负数 self.assertEqual(maxProduct_alternative([-1, -2, -3, -4]), 24) # 正负交替 self.assertEqual(maxProduct_alternative([1, -2, 3, -4, 5]), 120) # 3×-4×5=60不对,应该是全部相乘 def test_greedy_failure_cases(self): """测试贪心算法会失败的案例""" # 这个案例说明为什么需要同时维护max和min nums = [3, -1, 4] # 最大乘积应该是4,不是3 self.assertEqual(maxProduct_alternative(nums), 4) # 另一个经典案例 nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] # 最大乘积子数组应该是[4,-1,2,1]乘积为-8?不对,应该是[4]或者[4,-1,2,1]需要验证 # 先计算一下:4×-1×2×1 = -8,所以最大应该是4 self.assertEqual(maxProduct_alternative(nums), 4) def test_large_numbers(self): """测试大数字情况""" # 题目约束范围内的测试 self.assertEqual(maxProduct_alternative([10, 10, 10]), 1000) self.assertEqual(maxProduct_alternative([-10, -10, -10]), 1000) def test_algorithm_correctness(self): """验证算法正确性(多种情况对比)""" test_cases = [ ([1, 2, 3], 6, "全正数"), ([-1, -2, -3], 6, "全负数"), ([2, 3, -2, 4], 6, "正负混合"), ([0, 0, 0], 0, "全零"), ([1, 0, 3, 0, 2], 3, "中间有零"), ] for nums, expected, description in test_cases: with self.subTest(nums=nums, description=description): actual = maxProduct_alternative(nums) self.assertEqual(actual, expected)class TestMaxProductPropertyBased(unittest.TestCase): """基于属性的测试""" def test_result_greater_equal_than_min(self): """测试结果不小于数组最小值""" test_arrays = [ [1, 2, 3], [-3, -2, -1], [-1, 2, -3], [0, -1, 2] ] for nums in test_arrays: with self.subTest(nums=nums): result = maxProduct_alternative(nums) min_val = min(nums) self.assertTrue(result >= min_val) def test_result_less_equal_than_possible_max(self): """测试结果不大于可能的理论最大值""" test_arrays = [ [1, 2, 3], [-3, -2, -1], [-1, 2, -3] ] for nums in test_arrays: with self.subTest(nums=nums): result = maxProduct_alternative(nums) # 理论最大值不会超过所有数乘积的绝对值(考虑负数情况) import math abs_product = math.prod(abs(x) for x in nums) self.assertTrue(abs(result) <= abs_product)def run_comprehensive_test_suite(): """运行全面的测试套件并生成详细报告""" # 创建测试加载器 loader = unittest.TestLoader() # 创建测试套件 suite = unittest.TestSuite() suite.addTests(loader.loadTestsFromTestCase(TestMaxProductAlternative)) suite.addTests(loader.loadTestsFromTestCase(TestMaxProductPropertyBased)) # 运行测试 runner = unittest.TextTestRunner(verbosity=2) result = runner.run(suite) # 生成测试报告 print("\n" + "="*70) print("乘积最大子数组算法测试报告") print("="*70) print(f"运行测试数: {result.testsRun}") print(f"失败数: {len(result.failures)}") print(f"错误数: {len(result.errors)}") if result.wasSuccessful(): print("🎉 所有测试通过!算法实现正确。") # 显示关键测试用例验证 print("\n关键测试用例验证:") key_test_cases = [ ([2, 3, -2, 4], 6, "LeetCode示例1"), ([-2, 0, -1], 0, "LeetCode示例2"), ([-2, 3, -4], 24, "负负得正"), ([0, 2], 2, "包含零"), ([1], 1, "单元素") ] for nums, expected, description in key_test_cases: actual = maxProduct_alternative(nums) status = "✅" if actual == expected else "❌" print(f"{description:15} | 输入: {nums}") print(f"{' ':15} | 输出: {actual} (期望: {expected}) {status}") print("-" * 50) else: print("❌ 有测试失败,请检查算法实现。") # 输出失败详情 for test, traceback in result.failures + result.errors: print(f"\n失败测试: {test}") print(f"错误信息:\n{traceback}") return result.wasSuccessful()if __name__ == '__main__': # 运行全面测试 success = run_comprehensive_test_suite() # 退出代码 exit(0 if success else 1)