提示
中等
6.4K
相关企业
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != 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 。
1.总体思想:对整个数组进行遍历,对每一个遍历的值使用首尾指针来寻找另外两个符合要求的值。去重:对于这三个值,都要与其遍历方向的下一个位置的值进行比较,如果相等,就往下移一位,对于大循环的值使用continue来向下移一位。
2.详细思路
(1)判断特解,当数组为空或者长度小于3时返回空
(2)对数组进行排序
(3)使用for循环对数组进行遍历,判断当前第i个值是否>0,如果>0则表明之后的值不可能存在相加=0的情况,可以直接返回结果了
(4)判断当前第i个值是否与i-1(i+1会超过数组长度)的值相等且i>0,如果相等,则continue
(5)左指针j=i+1,右指针k=len(nums)-1
(6)使用while循环,当左指针<右指针时,如果nums[i]+nums[j]+nums[k]==0,则将这三个值添加到结果中,循环判断nums[j]是否等于nums[j+1],如果相等,则j=j+1;循环判断nums[k]是否等于nums[k-1],如果相等的话,k=k-1。j=j+1,k=k-1
(7)如果nums[i]+nums[j]+nums[k]<0,则说明nums[j]比较小,所以j=j+1
(8)如果nums[i]+nums[j]+nums[k]>0,则说明nums[k]比较大,所以k=k-1
困难
4.7K
相关企业
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5] 输出:9
1.总体思想:需要定义左右两个指针left和right
(1)如何确定雨水量:比较height[left]和max(height[0:left])的值以及height[right]和max(height[right:len(height)-1])的值来判断left位置和right位置能够容纳多少雨水
(2)如何判断指针向哪个方向移动:根据height[left-1]和height[right+1]的大小来决定。如果height[left-1]<height[right+1]说明此时能容纳多少余量由左边来决定,left指针向右移动;反之,right指针向左移动
2.详细思路
(1)定义左指针left=1,右指针right=len(height)-2
(2)当左指针<=右指针时
if height[left-1]<height[right+1]
更新max(height[0:left]):maxleft=max(maxleft,height[left-1])
if maxleft>height[left]:
计算left所在位置能够容纳的雨量:trapsum+=maxleft-height[left]
left=left+1
else
更新max(height[right:len(height)-1]):maxright=max(maxright,height[right+1])
if maxright>height[right]:
计算right所在位置能够容纳的雨量:trapsum=maxright-height[right]
right=right-1