两数之和变种------找到所有满足条件的数对

快手面试题解析:两数之和变种与优化策略 两数之和是算法面试中的经典问题,其核心是通过哈希表或双指针技术高效找到满足条件的元素组合。这类问题考察候选人对基础算法的掌握程度和优化能力,在实际工程中广泛应用于电商优惠计算、金融组合优化等场景。随着问题复杂度提升,衍生出三数之和、最接近目标值等变种,需要结合排序预处理和指针技巧进行优化。快手等大厂面试常通过这类变种题考察候选人的边界处理能力和代码实现细节,如处理重复元素、提前终止条件等关键点。掌握这些变种问题的通用解法,对提升算法面试通过率和解决实际工程问题都有重要价值。 阅读详情

目录

一、数对不重复

 二、要求所有数对pair,有重复,输出所有的下标pair


一、数对不重复

https://www.lintcode.com/problem/587/description

方法是排序加双指针,注意在判断两数之和等于target的分支里边,需要进行去重操作。且while中条件一定要用 i < j,因为中间会改变i和j,用 i != j是不准确的。

class Solution {
public:
    /**
     * @param nums: an array of integer
     * @param target: An integer
     * @return: An integer
     */
    int twoSum6(vector<int> &nums, int target) {
        // write your code here
        sort(nums.begin(), nums.end());
        int len = nums.size();
        int i = 0, j = len - 1;
        int ans = 0;
        while(i < j){
            if(nums[i] + nums[j] == target){
                ++ans;
                ++i;
                --j;
                // 以下两步去重
                while(i < j && nums[j] == nums[j + 1]) --j;
                while(i < j && nums[i] == nums[i - 1]) ++i;
            }else if(nums[i] + nums[j] < target) ++i;
            else --j;
        }
        return ans;
    }
};

如果要求不去重的话,就用下边第二题的套路,计算出左边重复长度和右边重复长度,然后相乘既是ans需要加的个数。

 二、要求所有数对pair,有重复,输出所有的下标pair

即给定一个数组nums,这个数组中可能有重复,给定一个target,找到数组中和为target的所有数对的下标pair。

上一例子中要求去重,这一题中要求不去重,关键是每次找到一两个位置的数相加等于target的时候,就判断接下来的数是不是重复,当然,前提还是得先排序。

这里为了在排序之后保留排序前得下标信息,用了个vector<pair<int, int>>来保存每个值与对应的下标的关系。

#include <bits/stdc++.h>
using namespace std;



vector<pair<int, int>> twosum(vector<int> &nums, int target){
  vector<pair<int, int>> ans; // 结果数组,存放下标pair
  vector<pair<int, int>> nums_id_pair; // 辅助数组,存放value与下标组成的pair
  int len = nums.size();

  // 初始化辅助数组,把所有数字和下标作为一对pair放入一个数组中
  for(int i = 0; i < len; ++i){
    nums_id_pair.push_back(make_pair(nums[i], i));
  }
  // 按value将pair的辅助数组排序
  sort(nums_id_pair.begin(), nums_id_pair.end());
  
  int left = 0, right = len - 1;

  while(left < right){
    
    if(nums_id_pair[left].first + nums_id_pair[right].first == target){
      // 重复元素处理
      // 计算left和right重复序列长度
      int l_len = 0, r_len = 0;
      while(left + l_len < right - r_len){ // 保证左右重复区域不交叉
        if(nums_id_pair[left].first == nums_id_pair[left + l_len].first) ++l_len; // 左边重复区域长度
        if(nums_id_pair[right].first == nums_id_pair[right - r_len].first) ++r_len; // 右边重复区域长度
        if(nums_id_pair[left].first != nums_id_pair[left + l_len].first && nums_id_pair[right].first != nums_id_pair[right - r_len].first) break;
      }
      for(int i = 0; i < l_len; ++i){
        for(int j = 0; j < r_len; ++j){
          ans.push_back(make_pair(nums_id_pair[left + i].second, nums_id_pair[right - j].second));
        }
      }
      // 更新left和right
      left += l_len;
      right -= r_len;

    }else if(nums_id_pair[left].first + nums_id_pair[right].first < target) ++left;
    else --right;
  }
  
  return ans;
}


int main()
{
  vector<int> nums{2, 3, 1, 1, 1, 4, 4, 2, 3};
  vector<pair<int, int>> ans = twosum(nums, 5);
  for(auto &a : ans){
    cout<<a.first<<" "<<a.second<<endl;
  }
  
  return 0;
}

结果:

程序员面试金典 – 面试题 16.24. 数对和(双指针/哈希map) 文章目录1. 题目2. 解题2.1 排序+双指针2.2 哈希map 1. 题目 设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。 示例 1: 输入: nums = [5,6,5], target = 11 输出: [[5,6]] 示例 2: 输入: nums = [5,6,5,6], target = 11 输出: [[5,6],[5,6]] 提示: nums.length <= 100000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/pairs-with-sum-lcci 著作权归领扣网络所有。商业 立即下载

相关推荐

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 345

# NK 0827 练习赛 反思

NK 0827 练习赛 反思 小小总结 期望得分 200 实际得分 210 还算可以的啦 但还是要继续加油 要稳住不要翻车的啊 A 异或 题面描述 何老板给你一个长度为\(N\)的整数数列 。 请你帮他找出满足下列条件的数字对\([l,r]\) 的个数: \(a_l\)^\(a_{l+1}\)^\(a_{l+2}\)...\(a_r\)=\(a_l\)+\(a_{l+1}\)+\(a_...

weixin_30549657的博客 274

ADS学习笔记 1. 功率放大器设计

基于ADS2023 update2的学习笔记1.功率放大器设计

u014087103的博客 1万+

给定一个元素唯一的数量大于2的数组,若数组两个数相加和为m,返回所有满足要求的数对

求和问题,给定一个数组,数组中的元素唯一,数组元素数量 N >2,若数组中的两个数相加和为 m,则认为该数对满足要求,请思考如何返回所有满足要求的数对(要求去重) 代码如下:如有错误,请指正 def madd(arr, m): lt = [] for index,i in enumerate(arr): for j in range(index+1): ...

景霄之上的博客 510

DP_AUX辅助通道介绍

DisplayPort(简称DP)是一个由PC及芯片制造商联盟开发,视频电子标准协会(VESA)标准化的数字式视频接口标准。其中辅助通道(AUX)是一条独立双向半双工的传输通道,它也是一对差分信号线。其数据传输速率1Mbps,用来传输配置参数与指令。

cjie221的博客 5341

第3章 信息技术服务(一)

对 第三章 《信息技术服务》中第一、二、三节 <内涵与外延、原理与组成、服务生命周期>进行总结、归纳

好好学习,天天向上的博客 733

【算法社区】算法笔试押题(两数之和、存在重复元素、LRU缓存)

【2022/03/18】力扣押题推荐(两数之和、存在重复元素、LRU缓存)

小明的Java问道之路 633

Modelsim安装教程以及管理员身份运行patch_dll.bat时找不到文件mgls.dll的解决

Modesim安装教程 Modesim版本有很多,但是安装方式大都相同,我们以modesim.10.5为例,电脑使用的是win10 64位,讲一下安装过程中的步骤以及出现问题的解决方法 一 安装 1.首先解压安装包,在解压的安装包内选择应用程序,右键选择管理员运行。 2.稍等一会,有的电脑会弹出是否允许modesim进行更改,选择 是 即可,然后出现下面的界面,点击下一步。 3.弹出此界面选择安装路径,选择安装路径,我是在D盘新建的文件夹,直接把文件夹中的路径复制在框内。文件夹名称切记不要带中文 4.

weixin_48564372的博客 1万+

程序员面试金典——解题总结: 9.17中等难题 17.12设计一个算法,找出数组中两数之和为指定值的所有整数对。

#include #include #include #include using namespace std; /* 问题:设计一个算法,找出数组中两数之和为指定值的所有整数对。 分析:如果数组直接用无序的做,时间复杂度为O(n^2),对每个整数,遍历剩余整数。 如果先对数组排序,然后一个从左边,一个从右边,向中间遍历,时间复杂度为:排序时间复杂度O(NlogN),两边向

qingyuanluofeng的专栏 1036

QLineEdit控件: 实现IP地址输入框(基于编辑信号)

在开发网络应用程序时,经常需要用户输入IP地址。直接使用普通输入框容易导致格式错误,用户体验也较差。本文将手把手教你用Qt的QLineEdit控件实现一个智能IP地址输入框。即使你是刚接触Qt的新手,也能通过本文理解核心实现原理。

u011186532的专栏 649

Python爬虫终极实战:逆向解析+异步处理,高效爬取中关村在线万级产品数据

爬虫工程师的战场,已经从简单的HTML解析,转向了对网络协议、JavaScript执行逻辑的深度逆向工程。然后刷新页面,当浏览器发起这个请求时,执行会暂停,我们可以一步步跟蹤调用栈(Call Stack),找到发起请求前的JavaScript代码,从而发现参数的计算逻辑。它们会添加一个动态的、一次性的签名(token)或加密参数,用于验证请求的合法性。这是整个爬虫最核心、最具技术含量的部分。的请求,其响应体正是结构清晰的JSON数据,包含了当前页面的所有手机信息(产品ID、名称、价格、图片等)。

2201_76125261的博客 429

两数和

问题描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 我的解决方法: import java.util.Arrays; class Test01 { public int[]

HB15458755的博客 264

Spring Framework 7.002.Spring IoC 容器与 Bean 简介(Introduction to the Spring IoC Container and Beans)

摘要:Spring框架的核心技术包括IoC容器和AOP技术。IoC容器通过依赖注入实现控制反转,提供Bean管理和配置功能。ApplicationContext作为BeanFactory的扩展,增加了企业级特性。文档详细介绍了容器配置、Bean定义、依赖注入、作用域等核心概念,以及基于注解的配置方式。AOP框架支持80%的AOP需求,并可集成AspectJ。此外还涵盖环境抽象、容器扩展点等高级特性,为Java企业应用开发提供全面支持。(150字)

无 212

LeetCode167. Two Sum II - Input array is sorted

一、问题描述 Given an array of integers that is alreadysorted in ascending order, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two ...

ixiaowei1993的博客 162

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

leetcode两数之和变种(找出所有满足总和的两个数)

偶尔看到leetcode 的两数之和,但是之前遇到过两数之和的变种,之前一开始想不出来,后面看了别人的题解才想到解法,这里记录一下。 题目描述: 原leetcode题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 你可以按任意顺序返回答案。 示例1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释

kanlon的博客 1064

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

两数、三数以及四数之和

如果这道题中的给定数组升序排列的,这道题还可以采用双指针来解决,定义left指针指向数组的起始位置,right指针指向数组的末尾位置,如果nums[left] + nums[right] > target,right指针向左移动一次,如果nums[left] + nums[right] < target,left指针向右移动一次,如果left >= right,还没有找到符合nums[left] + nums[right] = target的答案,直接返回[-1, -1]。

qq_43552690的博客 1475

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

两数之和 三数之和 四数之和一网打尽

目录 两数之和: ????思考方式: 两数之和II ????解题图示: 三数之和: 最近的三数之和: 四数之和: 两数之和: 对应letecode链接: https://leetcode-cn.com/problems/two-sum/ 题目描述: 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

qq_56999918的博客 1424

算法之N数之和

简述 从例题的角度出发,一次解决所有的N数之和问题。 例题目录 1. T1. 两数之和 简单 2. T15. 三数之和 中等 3. T18. 四数之和 中等 4. T16. 最接近的三数之和 中等 5. T633. 平方数之和 中等 6. T剑指 Offer 57. 和为s的两个数字 简单 7. T剑指 Offer 57 - II. 和为s的连续正数序列 简单 详细 1. 两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,

pl0321的博客 2142

LeetCode——两数之和、三数之和、四数之和

两数之和、三数之和两数之和解法一解法二三数之和解法一解法二 两数之和 题目地址:两数之和 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解...

ghw15221836342的博客 2133

算法两数之和

在算法设计领域,“两数之和”是一个非常经典的问题,它不仅考察了对数据结构的理解,还测试了编程者解决实际问题的能力。本文将深入探讨“两数之和”的多种解决方案,包括但不限于暴力解法、哈希表方法以及双指针技巧,并通过具体的代码实例来展示每种方法的应用场景和优劣分析。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。更高效的解决方案是利用哈希表存储已经遍历过的数字及其索引,当遍历到新的数字时,可以快速判断目标值减去当前值的结果是否已经在哈希表中存在。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 841

leetcode 两数之和、三数之和、最接近的三数之和、四数之和

题目链接:四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意: 答案中不可以包含重复的四元组。 示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 ...

指点 4796

面试官问:两数之和、三数之和、直至 N 数之和?套路一致吗?

算法是所有面试官都会问到的问题,旨在考察候选人的逻辑思维能力,其中最最基础的就是两数之和问题两数之和的解法很简单,但仅仅会这个就完了吗?大部分的面试官都会扩展到三数之和、四数之和直至 N ...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 352

Java两数之和

目录题目思路代码结果 题目 在给定数组中找出和为 目标值的那两个整数,并输出他们的数组下标 int[] nums= {2,7,11,15}; int target = 9; 思路 编写计算两数之和的方法,并在主方法进行输出。 调用两个for循环语句进行遍历,求满足条件的那两个整数 代码 public class Mission9Demo3 { //两数之和 //在该数组中找出和为 目标值的那两个整数,并输出他们的数组下标 public static void main(String[] arg

java lover 1548

LeetCodeK数之和

LeetCode关于K数之和题目分享 题目1:两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = ...

qq_39215715的博客 632

【C++】两数之和、三数之和、四数之和

两数之和、三数之和、四数之和

w903414的博客 1112

LeetCode 两数之和,三数之和,最接近的三数之和,四数之和(C++)

1. 两数之和 问题描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 解题思路 使用map来存储容器中的元素和数组下标,判断target - nums[i]是否在map中,如果不在,返回{},如果在判断元素nums[i]数组下标的和nums[target - nums[i]]的数组下标是否一致,只有在不一致时才符合题意。 示例: 给定 nums = [2

bwqiang的博客 482
上一篇: leetcode 1605. 给定行和列的和求可行矩阵
下一篇: leetcode 198. 打家劫舍
罗古洞的女婿
博客等级 码龄10年 1117粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值