leetcode 15. 三数之和 (多益网络笔试) (二维矩阵行数列数)

63 篇文章 0 订阅
17 篇文章 1 订阅

在这里插入图片描述

在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;

class Solution {
public:
	vector<vector<int>> threeSum(vector<int>& nums) {
		vector<vector<int>> result;
		sort(nums.begin(), nums.end());
		// 找出a + b + c = 0
		// a = nums[i], b = nums[left], c = nums[right]
		for (int i = 0; i < nums.size(); i++) {
			// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
			if (nums[i] > 0) {
				return result;
			}
			// 错误去重方法,将会漏掉-1,-1,2 这种情况
			/*
			if (nums[i] == nums[i + 1]) {
			continue;
			}
			*/
			// 正确去重方法
			if (i > 0 && nums[i] == nums[i - 1]) {
				continue;
			}
			int left = i + 1;
			int right = nums.size() - 1;
			while (right > left) {
				// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组
				/*
				while (right > left && nums[right] == nums[right - 1]) right--;
				while (right > left && nums[left] == nums[left + 1]) left++;
				*/
				if (nums[i] + nums[left] + nums[right] > 0) {
					right--;
				}
				else if (nums[i] + nums[left] + nums[right] < 0) {
					left++;
				}
				else {
					result.push_back(vector<int>{nums[i], nums[left], nums[right]});
					// 去重逻辑应该放在找到一个三元组之后
					while (right > left && nums[right] == nums[right - 1]) right--;
					while (right > left && nums[left] == nums[left + 1]) left++;

					// 找到答案时,双指针同时收缩
					right--;
					left++;
				}
			}

		}
		return result;
	}
};


int main(){ 
	Solution a;
	vector<int> nums = { -1, 0, 1, 2, -1, -4 };
	vector<vector<int>> res;
	res=a.threeSum(nums);
	int rows = res.size();
	for (int i = 0; i < rows; i++){
		cout << '[';
		for (int j = 0; j < 3; j++){
			cout << res[i][j];
			if (j != 2) cout << ',';
		}
		cout << ']' << endl;
	}


	system("pause");
	return 0;
}



二维矩阵行数/列数
在这里插入图片描述

我的第一次写的(可通过nums = [-1,0,1,2,-1,-4]示例)

问题是没有去重 无法通过在这里插入图片描述

class Solution {
public:
	vector<vector<int>> threeSum(vector<int>& nums) {
		//三个数分别是i left right
		//i从0开始 left从i+1开始
		int left;
		int right = nums.size() - 1;
		vector<vector<int>> res;
		sort(nums.begin(), nums.end());
		for (int i = 0; i<nums.size(); i++){
			if (nums[i]>0) return res;
			left = i + 1;
			while (left<right){
				if (nums[i] + nums[left] + nums[right]>0 && left<right){
					right--;
				}
				else if (nums[i] + nums[left] + nums[right]<0 && left<right){
					left++;
				}
				else{
					res.push_back(vector<int>{nums[i], nums[left], nums[right]});
					right--;
					left++;
				
				}
			}

		}
		return res;
	}
};

在找到一个三维数组之后去重 加上下面两句

		while (right > left && nums[right] == nums[right - 1]) right--;
		while (right > left && nums[left] == nums[left + 1]) left++;

又卡了一个新的测试案例
在这里插入图片描述
少了很多答案
少答案的原因是right的定义 不该在while的外面 这样每次ileft变化的时候right只是在一直减小,没有回到数组的最后
right的定义改正后,有卡了一个示例
在这里插入图片描述
是因为不光加那两行给leftright去重,还要给i去重
加上

			if (i > 0 && nums[i] == nums[i - 1]) {
				continue;
			}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值