1.两数之和 算法

法1: 暴力求解法

class Solution 
{
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        for(int i = 0; i < nums.size(); i++)
        {
            for(int j = i + 1; j <nums.size(); j++)
            {
                //双重循环判断 如果两数之和等于目标值 则返回
                if(nums[i] + nums[j] == target)
                {
                    nums.clear();
                    nums.push_back(i);
                    nums.push_back(j);
                    return nums;
                }
            }
            
        }
        return nums;
    }
};

法2:二分求和算法

class Solution
{
	//自定义排序规则算法 升序排序
	struct Less 
	{
		bool operator()(pair<int, int>&a, pair<int, int>&b) 
		{
			return a.second < b.second;
		}
	};

public:
	vector<int> twoSum(vector<int>& numbers, int target)
	{
		//定义键值对 一个存储值 一个存储位置信息
		vector<pair<int, int>> number;

		//按照顺序对容器内的数字进行压入
		for (int i = 0; i < numbers.size(); i++)
		{
			number.push_back(make_pair(i, numbers[i]));
		}

		//调用排序算法,使其成为有序系列
		sort(number.begin(), number.end(), Less());

		//定义下标 从两边向中间靠近
		int L = 0, R = numbers.size() - 1;

		//当左边小标小于右边时进行循行判断
		while (L < R)
		{
			//如果两数之和等于目标值
			if (number[L].second + number[R].second == target) 
			{
				int t1 = number[L].first;
				int t2 = number[R].first;
				vector<int> result{ min(t1,t2),max(t1,t2) };
				return result;
			}
			//如果两数之和小于目标值 左下标右移 两数之和就会增大
			if (number[L].second + number[R].second < target)
			{
				L++;
			}

			//如果两数之和大于目标值 右下标右移 两数之和就会减小
			if (number[L].second + number[R].second > target) {
				R--;
			}
		}

		//如果不存在,返回-1,-1
		vector<int> result{ -1,-1 };
		return result;
	}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值