三数之和(Python and C++解法)
时间:2020-05-30
本文章向大家介绍三数之和(Python and C++解法),主要包括三数之和(Python and C++解法)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
给你一个包含 n个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
思路:
需要三个指针:当前指针i,另外两个指针left和right分别在当前指针右侧的子数组的两端。通过left与right交替向中间移动,计算对于每个i指针所有满足的nums[i] + nums[left] + nums[right] == 0 的[ i,left,right]组合,遍历的过程中需要注意去除重复元素。
Python解法:
1 class Sloution(object): 2 @staticmethod 3 def three_sum(nums): 4 n = len(nums) 5 res = [] 6 if not nums or n <=3: 7 return [] 8 nums.sort() # 升序排序 9 10 for i in range(n-2): # 最后两个元素不需要遍历 11 if nums[i] > 0: 12 break 13 if i > 0 and nums[i] == nums[i-1]: # 去除重复元素 14 continue 15 left = i + 1 16 right = n - 1 17 while left < right: 18 s = nums[i] + nums[left] + nums[right] 19 if s < 0: 20 left += 1 21 elif s > 0: 22 right -= 1 23 else: 24 res.append((nums[i], nums[left], nums[right])) 25 left += 1 26 right -= 1 27 while left < right and nums[left] == nums[left-1]: # 去除重复元素 28 left += 1 29 while left < right and nums[right] == nums[right + 1]: # 去除重复元素 30 right -= 1 31 return res 32 33 if __name__ == '__main__': 34 the_nums = [-1, 0, 1, 2, -1, -4] 35 s = Sloution() 36 result = s.three_sum(the_nums) 37 print(result) # [(-1, -1, 2), (-1, 0, 1)]
C++解法:
1 #include "pch.h" 2 #include <iostream> 3 #include <vector> 4 #include <algorithm> 5 using namespace std; 6 7 class Sloution { 8 public: 9 vector<vector<int>> threeSum(vector<int> &nums) { // 函数返回的是二维vector 10 int n = nums.size(); 11 vector<vector<int>> res; 12 if (n < 3) 13 return res; 14 sort(nums.begin(), nums.end()); // 数组排序 15 16 for (int i = 0; i < n - 2; i++) { 17 if (i > 0 && nums[i] == nums[i - 1]) 18 continue; 19 int left = i + 1; 20 int right = n - 1; 21 while (left < right) { 22 int s = nums[i] + nums[left] + nums[right]; 23 if (s < 0) 24 left += 1; 25 else if (s > 0) 26 right -= 1; 27 else { 28 vector<int> tempRes{ nums[i], nums[left], nums[right] }; // 组成一个vector 29 res.push_back(tempRes); 30 left += 1; 31 right -= 1; 32 while (left < right && nums[left] == nums[left - 1]) 33 left += 1; 34 while (left < right && nums[right] == nums[right + 1]) 35 right -= 1; 36 } 37 } 38 } 39 return res; 40 } 41 }; 42 43 int main() { 44 vector<int> theNums{ -1, 0, 1, 2, -1, -4 }; 45 Sloution s; 46 for (auto aRes : s.threeSum(theNums)) // 打印二维vector 47 for(int k = 0; k < aRes.size(); k++) 48 cout << aRes[k] << " "; // -1 -1 2 -1 0 1 49 }
原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/12992857.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法