当前位置: 首页 > wzjs >正文

自己写代码做网站合肥网站制作推广

自己写代码做网站,合肥网站制作推广,昌平做网站公司,黄梅那里有做网站的一、问题描述:三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中…

一、问题描述:三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 10^{5}

二、实现方案

方案一:双指针法

方法思路:

  1. 排序数组:首先将数组排序,以便于后续处理重复元素和使用双指针法。
  2. 固定第一个元素:遍历数组中的每个元素作为三元组的第一个元素。
  3. 双指针查找:对于每个固定的第一个元素,使用双指针在剩余部分中查找另外两个元素,使得三数之和为 0。
  4. 跳过重复元素:在遍历和查找过程中,跳过重复的元素以避免生成重复的三元组。

复杂度:

  • 时间复杂度为 O(n²),
  • 空间复杂度为 O(1)(不考虑排序的空间),是解决此问题的最优方案。

代码实现:

  • Python
def threeSum(nums):nums.sort()res = []n = len(nums)for i in range(n - 2):# 跳过重复的第一个元素if i > 0 and nums[i] == nums[i - 1]:continueleft, right = i + 1, n - 1while left < right:total = nums[i] + nums[left] + nums[right]if total < 0:left += 1elif total > 0:right -= 1else:res.append([nums[i], nums[left], nums[right]])# 跳过左侧重复元素while left < right and nums[left] == nums[left + 1]:left += 1# 跳过右侧重复元素while left < right and nums[right] == nums[right - 1]:right -= 1# 移动指针以寻找下一个可能的三元组left += 1right -= 1return res
  •  php:
function threeSum($nums) {sort($nums); // 将数组排序$result = array();$n = count($nums);for ($i = 0; $i < $n - 2; $i++) {// 跳过重复的起始元素if ($i > 0 && $nums[$i] == $nums[$i - 1]) {continue;}$left = $i + 1;$right = $n - 1;$target = -$nums[$i]; // 转化为两数之和问题:nums[left] + nums[right] = targetwhile ($left < $right) {$sum = $nums[$left] + $nums[$right];if ($sum == $target) {// 找到有效组合,加入结果array_push($result, array($nums[$i], $nums[$left], $nums[$right]));// 跳过左侧重复元素while ($left < $right && $nums[$left] == $nums[$left + 1]) {$left++;}// 跳过右侧重复元素while ($left < $right && $nums[$right] == $nums[$right - 1]) {$right--;}// 移动指针寻找下一个可能$left++;$right--;} elseif ($sum < $target) {$left++; // 和太小,左指针右移} else {$right--; // 和太大,右指针左移}}}return $result;
}
  •  golang:
package mainimport ("fmt""sort"
)func threeSum(nums []int) [][]int {sort.Ints(nums) // 先排序var result [][]intn := len(nums)for i := 0; i < n-2; i++ {// 跳过重复的第一个元素if i > 0 && nums[i] == nums[i-1] {continue}left, right := i+1, n-1target := -nums[i] // 转化为两数之和问题for left < right {sum := nums[left] + nums[right]if sum == target {// 找到有效组合result = append(result, []int{nums[i], nums[left], nums[right]})// 跳过左侧重复元素for left < right && nums[left] == nums[left+1] {left++}// 跳过右侧重复元素for left < right && nums[right] == nums[right-1] {right--}// 移动指针寻找下一个可能left++right--} else if sum < target {left++ // 和太小,左指针右移} else {right-- // 和太大,右指针左移}}}return result
}## 测试实例
func main() {// 示例 1nums1 := []int{-1, 0, 1, 2, -1, -4}fmt.Println(threeSum(nums1)) // 输出:[[-1 -1 2] [-1 0 1]]// 示例 2nums2 := []int{0, 1, 1}fmt.Println(threeSum(nums2)) // 输出:[]// 示例 3nums3 := []int{0, 0, 0}fmt.Println(threeSum(nums3)) // 输出:[[0 0 0]]
}

方案二:暴力法(三重循环)

复杂度:

  • 时间复杂度:O(n³),适用于极小的数据量,但在题目约束下会超时。

代码实现:

  • Python:
def threeSumBruteForce(nums):res = []nums.sort()n = len(nums)for i in range(n-2):if i > 0 and nums[i] == nums[i-1]:continuefor j in range(i+1, n-1):if j > i+1 and nums[j] == nums[j-1]:continuefor k in range(j+1, n):if k > j+1 and nums[k] == nums[k-1]:continueif nums[i] + nums[j] + nums[k] == 0:res.append([nums[i], nums[j], nums[k]])return res
  • PHP:
function threeSumBruteForce($nums) {sort($nums);$result = array();$n = count($nums);for ($i = 0; $i < $n - 2; $i++) {if ($i > 0 && $nums[$i] == $nums[$i-1]) continue;for ($j = $i+1; $j < $n - 1; $j++) {if ($j > $i+1 && $nums[$j] == $nums[$j-1]) continue;for ($k = $j+1; $k < $n; $k++) {if ($k > $j+1 && $nums[$k] == $nums[$k-1]) continue;if ($nums[$i] + $nums[$j] + $nums[$k] == 0) {array_push($result, [$nums[$i], $nums[$j], $nums[$k]]);}}}}return $result;
}
  •  Golang:
func threeSumBruteForce(nums []int) [][]int {sort.Ints(nums)var result [][]intn := len(nums)for i := 0; i < n-2; i++ {if i > 0 && nums[i] == nums[i-1] {continue}for j := i + 1; j < n-1; j++ {if j > i+1 && nums[j] == nums[j-1] {continue}for k := j + 1; k < n; k++ {if k > j+1 && nums[k] == nums[k-1] {continue}if nums[i]+nums[j]+nums[k] == 0 {result = append(result, []int{nums[i], nums[j], nums[k]})}}}}return result
}

方案三:哈希表法

复杂度:

  • 时间复杂度:O(n²),但哈希表操作常数较大,实际效率可能不如双指针法。

代码示例

  • python:
def threeSumHash(nums):res = []nums.sort()n = len(nums)for i in range(n - 2):if i > 0 and nums[i] == nums[i - 1]:continueseen = set()target = -nums[i]j = i + 1while j < n:complement = target - nums[j]if complement in seen:res.append([nums[i], complement, nums[j]])while j + 1 < n and nums[j] == nums[j + 1]:j += 1seen.add(nums[j])j += 1return res
  •  php:
function threeSumHash($nums) {sort($nums);$result = array();$n = count($nums);for ($i = 0; $i < $n - 2; $i++) {if ($i > 0 && $nums[$i] == $nums[$i-1]) continue;$seen = array();$target = -$nums[$i];for ($j = $i + 1; $j < $n; $j++) {$complement = $target - $nums[$j];if (in_array($complement, $seen)) {array_push($result, [$nums[$i], $complement, $nums[$j]]);while ($j + 1 < $n && $nums[$j] == $nums[$j+1]) $j++;}array_push($seen, $nums[$j]);}}return $result;
}
  •  Golang:
func threeSumHash(nums []int) [][]int {sort.Ints(nums)var result [][]intn := len(nums)for i := 0; i < n-2; i++ {if i > 0 && nums[i] == nums[i-1] {continue}seen := make(map[int]bool)target := -nums[i]for j := i + 1; j < n; j++ {complement := target - nums[j]if seen[complement] {result = append(result, []int{nums[i], complement, nums[j]})// 跳过重复的jfor j+1 < n && nums[j] == nums[j+1] {j++}}seen[nums[j]] = true}}return result
}

三、效率对比

  • 双指针法:最优解,时间复杂度 O(n²),空间复杂度 O(1)(排序的辅助空间可忽略),适用于大规模数据。
  • 哈希表法:同样时间复杂度 O(n²),但实际运行效率较低,且处理重复元素逻辑复杂。
  • 暴力法:仅适用于极小数据量,实际不可行。
http://www.dtcms.com/wzjs/50928.html

相关文章:

  • 网站备案各种问题汇总百度企业推广怎么收费
  • 太仓有没有做网站建设的手机网站快速建站
  • 做平面哪个网站的素材最好如何在百度上建立网站
  • 软件开发哪里学河南百度关键词优化排名软件
  • wordpress 提供api成都关键词优化平台
  • 咨询服务类网站建设百度推广服务费一年多少钱
  • wordpress允许用户修改文章整站seo外包
  • 实名制认证网站seo是搜索引擎营销
  • 网站开发网页设计北京师范大学出版社seo的方式有哪些
  • 东莞有哪些网络有限公司网站关键词推广优化
  • 苏州网站开发公司兴田德润优惠吗怎么开通网站平台
  • 包头建设安全协会网站做网络推广有哪些平台
  • 营销网站型建设多少钱宁波免费seo排名优化
  • asp.net开发网站和优势搜索引擎营销的方式
  • 网站怎么更改后台登陆密码什么是软文写作
  • 南阳建设网站制作品牌网络营销案例
  • 湖南品牌网站建设站长之家 seo查询
  • 想做外贸去哪个网站做宜昌网站seo
  • 烟台做网站的价格安徽seo顾问服务
  • 建设网站需要注意事项网络营销做得比较成功的案例
  • 网络服务商简称深圳谷歌优化seo
  • 棋牌网站怎么做优化进一步优化
  • 自己做网站怎么做百度合伙人官网app
  • 南通网站关键词推广长沙推广公司
  • 新网站如何做快照市场营销互联网营销
  • 网站建设报价方案下载百度地图的精准定位功能
  • 湖南疫情最新情况风险等级分布图seo搜索引擎优化介绍
  • 云网站 制作今日国内重大新闻事件
  • php 网站后台管理系统搜索优化推广公司
  • asp做微网站百度竞价推广后台