Sum-s问题

声明:

  • 本文只讨论:若存在多个满足要求的结果,只返回任一结果即可 的情况;
  • 若需返回满足要求的所有结果,稍加改进即可,本文不做讨论;

1 两数

已知

  • 一个整形无序数组 n u m s nums nums
  • 一个整数 s s s;

查找其和为s的两个数。

解决办法有两种:

  • hash
  • 排序
//hash
//时间复杂度O(n),空间复杂度O(n)
vector FindNumbersWithSum(vector& nums,int sum) {
    vector res;
    unordered_map lib;
    for(int i = 0; i < nums.size(); ++i)
    {
    	auto it = lib.find(nums[i]);
    	if(it == lib.end())
    	{
    		lib.insert({sum - nums[i], i});
    	}
    	else
    	{
    		res.push_back(nums[it->second]);
    		res.push_back(nums[i]);
    		break;
    	}
    }
    return res;
}
//排序
//时间复杂度O(nlgn),空间复杂度O(1)
vector FindNumbersWithSum(vector& nums,int sum) {
	sort(nums.begin(), nums.end());
    vector res;
    int idxB = 0;
    int idxE = nums.size() - 1;
    while(idxB < idxE)
    {
        int temp = nums[idxB] + nums[idxE];
        if(temp == sum)
        {
            res.push_back(nums[idxB]);
            res.push_back(nums[idxE]);
            break;
        }
        temp < sum ? ++idxB : --idxE;
    }
	return res;
}

使用:

  • 如果数组已有序:直接使用排序方法,此时,时间复杂度O(n),空间复杂度O(1);
  • 如果数组无序:除非要求空间复杂度必须为O(1),否则直接使用hash方法;

连续子序列

已知

  • 一个整形无序数组 n u m s nums nums
  • 一个整数 s s s;

查找和为s的连续子序列。

思路:

  • 先求出数组的prefix sum array;
  • 参考hash,转换成基于prefix sum array的Minus-s问题;
  • 时间复杂度O(n),空间复杂度O(n);

子序列

已知

  • 一个整形无序数组 n u m s nums nums
  • 一个整数 s s s;

查找和为s的子序列。

练习题

LeetCode 1. Two Sum
LeetCode 15. 3Sum

你可能感兴趣的:(#,数组)