从数组中选出n个数之和为k

面试算法总结系列——和为K的算法 这里引入几个面试中常见的算法题目,都不难 1 从一串有序数组中找到和为K的连续子数组。比如[1,2,2,3,5,6,7,8,9],k=5,那么答案就是[1,2,2],[2,3],[5] 思路 这个题目咋一看是没有任何思路的,只能暴力,两重for循环,这个代码贴一下 private List<List<Integer>> caTsum(int[] num, int lev)... 阅读详情

LeetCode15. 3Sum

题目描述:

https://leetcode.com/problems/3sum/

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:
Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4},

A solution set is:
(-1, 0, 1)
(-1, -1, 2)

LeetCode15. 3Sum 相当于1. Two Sum的一个变形嘛,题目大意就是从无序数组中找3个数a,b,c,使得a+b+c=0。返回数组中所有的可能作为结果集,结果集中不能包含重复。

思路:

我们可以写成a+b=-c的形式,-c作为target,只不过这次target不是传参指定,而是从给定的数组中找。
遍历i=0到i=len-2,使得target=-nums[i],然后再用双指针的方法选数,选数的范围[i+1,len-1]。
唯一需要注意的就是去重。

代码:
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int len=nums.size();
        vector<vector<int>> res;
        if(len==0){
            return res;
        }
        sort(nums.begin(),nums.end());
        int low,high,target;
        for(int i=0;i<len-1;i++){
            if(i>0 && nums[i-1]==nums[i]){
                continue;
            }
            target=0-nums[i];
            low=i+1;
            high=len-1;
            while(low<high){
                if(nums[low]+nums[high]==target){
                    vector<int> v;
                    v.push_back(nums[i]);
                    v.push_back(nums[low]);
                    v.push_back(nums[high]);
                    res.push_back(v);
                    low++;
                    high--;
                    while(low<high && nums[low-1]==nums[low]){
                        low++;
                    }
                    while(low<high && nums[high+1]==nums[high]){
                        high--;
                    }
                }
                else if(nums[low]+nums[high]<target){
                    low++;
                }
                else{
                    high--;
                }
            }
        }
        return res;
    }
};

题目2

如果是从数组中选出n个数之和为k呢,返回结果集,结果集不含重复。

思路:

我们就用递归回溯来解决问题了。
需要注意的还是去重。
我用pre来处理重复问题,对于递归进入的同一层函数,所选的数字不能相同,所以用pre来记录下标, 如果相同就continue.

代码:
void combinationSum(vector<vector<int>>& res, vector<int>& candidates, int len, int cur, int sum,int n, int target, vector<int>& v){
    if (sum > target || cur > len || v.size()>n){
        return;
    }
    else if (sum == target && v.size()==n){
        res.push_back(v);
        return;
    }
    else{
        int pre = -1;
        for (int i = cur+1; i < len; i++){
            if (pre != -1 && candidates[pre] == candidates[i]){
                continue;
            }
            pre = i;
            sum += candidates[i];
            v.push_back(candidates[i]);
            combinationSum(res, candidates, len, i + 1, sum,n, target, v);
            v.pop_back();
            sum -= candidates[i];
        }
    }
}
vector<vector<int>> combinationSum(vector<int>& candidates, int n, int target){
    int len = candidates.size();
    vector<vector<int>> res;
    if (len == 0){
        return res;
    }
    vector<int> v;
    sort(candidates.begin(),candidates.end());
    combinationSum(res, candidates, len, -1, 0,n, target, v);
    return res;
}

int main()
{
    vector<int> candidates;
    candidates.push_back(2);
    candidates.push_back(1);
    candidates.push_back(0);
    candidates.push_back(7);
    candidates.push_back(1);
    candidates.push_back(0);
    candidates.push_back(7);
    vector<vector<int>> res = combinationSum(candidates,2,9);
    system("pause");
    return 0;
}
华为面试题:判断数组内是否存在任意数的和等于给定的K 题目:给定数组a1,a2…an,n<10000。判断是否其中几个数之和为k,每个下标的数字仅可用一次。,若存在,返回true,不存在返回false。 #include <iostream> #include<algorithm> using namespace std; bool IsContainNumTotalK(int *nums,int size,int k) { if (0 == size) { return false; 阅读详情

相关推荐

找和为K的两个元素(C++)

第一行输入序列的长度n和k,用空格分开。第二行输入序列中的n个[1,100]范围内整。小黑有一个长度为n(n≤1000)的整数序列,判断是否存在某两个元素之和为。2.用双重for循环依次去试等不等于K,如果等于就输出yes,结束主程序。如果存在某两个元素的和为k,则输出“yes",否则输出“no”。1.输出时每行末尾的多余空格,不影响答案正确性。2.输出的yes和no是小写,不是大写。3.全部判断完后,不等于就输出no。1.创建数组,把数存进去。

QA_0005的博客 977

LeetCode560:和为K的数组

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 : 数组的长度为 [1, 20,000]。 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/subarray-sum-equals-

probie的博客 548

从N个数中选最小的K个数

<br /> <br /> <br /> <br />声明:题目来自: http://blog.youkuaiyun.com/v_JULY_v/archive/2010/11/17/6015165.aspx  JULY整理了100道微软等公司的面试题目,我想先不看答案:http://blog.youkuaiyun.com/v_JULY_v/archive/2011/01/10/6126406.aspx 自己先做一遍。<br /> <br />题目:<br /><br />5. 查找最小的k 个元素<br />题目:输入

arrow_pig的专栏 2567

数组问题二

一 将一个整数数组划分为K个相等的子集问题(字节跳动面试题) 题目:给定一个整数数组nums和一个正整数k,找出是否有可能把这个数组分成k个非空子集,其总和都相等。 示例 1: 输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4 输出: True 说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。 注意: 1 0 < nums[i] < 10000 前提:需要先明确一个问题,一个数组能够划分出 k 个和...

sarracode的博客 1234

N个数里面找出最大的k个数

题目:给出N个无序的数,然后找出其中最大的k个数 解题思路:          首先测试数据有可能会有一亿个数,数据量特别的大,数据库不可能存储这么多的数据。如果直接sort排序,NlogN时间复杂度实在是太高,大于10^9。我们可以考虑对数据进行分块读取,每次读取的数据块大小应大于k。          不如先假设第一次读取的数据块前k个数最大,然后把k个数建成最小二叉堆。然后从第k+1个

ンZee的解题报告 5320

【搞定算法】找出数组中出现次数大于数组长度一半和 N/K 的数

博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java 一起交流秋招面试经验。 目 录: 1、找出数组中出现次数大于数组长度一半的数 2、找出数组中出现次数大于数组长度 N/K 的数 1、找出数组中出现次数大于数组长度一半的数 一个数组中出现次数大于数组长度一般的数显然最多只有一个。 题目:在数组中找到出现次数大于数组长度一半的数。...

Java学习 5220

从n个数中选出k个数

从n个数中选出k个数 #include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> a; vector<int> b; void fun(int a) { cout << a << " "; ...

你听我说,在这个地方你这样做,才是对的。 2762

找出集合S最接近中位数的k(k≤n)个数

相关问题: 给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k≤n后,它能确定出S中最接近其中位数的k个数. 思考过程: 如果给出在线性时间内的算法,那么可能要用到最坏为线性时间的查找第i小元素的子程序SELECT。我们先找到这n个数的中位数,然后以此中位数为中心,左边距离中位数k/2个远的位置是这k个数的左端点,右边距离中位数k/2个远的位置是这k个数的右端点。用

z84616995z的专栏 6957

选数--递归(从n个数中选出k个数进行求和运算--组合问题)

题目描述 已知n个整数x_1,x_2,…,x_n以及1个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34 现在,要求你计算出和为素数共有多少种。 例如上例,只有一种的和为素数:3+7...

小糊涂的博客 1万+

求无序数组之中最小的k个数

在无序数组中国找最小的k个数,一般有以下几种办法:   1.比较排序,然后找最小的k个数,时间复杂度下界为O(nlogn)   2.计数排序,时间复杂度可以做到O(n),但是要看具体的数据情况。也比较费空间。 以上做法都是把所有元素的个数排好序,但是我们只需要找到前k个最小的数,不要求所有数据有序。   3.遍历所有数据,找到最小的数。再遍历剩下的数,找第二小的数,如此遍历k次,时间复杂度

l-jobs的专栏 2121

选择问题(一组N个数确定其中的第K个最大者)

1、该问题的一种解法是讲这N个数读进一个数组中,在通过某种简单排序算法(如:冒泡排序),以递减的 顺序将数组排序,然后返回位置k上的元素。(c语言编写,输入输出c++,纯c的话改过来即可) #include #include #define SIZE 10 using namespace std; int *BubbleSort(const int A[], int N

行影神 3572

DFS 实现从n个数中选k个数

#include <stdio.h> int a[10],book[10],b[10],count,n,k; //从n个数里选k个数 //a是n个数的数组,book是标记a数组中元素的数组,b是从a中选出k个数后的数组 void dfs(int step) { int i; if(step==k+1) //需要k个数,当step=k+1时返回 { count++; ...

Genger23的博客 1398

【Python&RS】Rasterio库安装+基础函数使用教程

Rasterio是一个Python库,专门用于栅格数据的读写操作。它支持多种栅格数据格式,如GeoTIFF、ENVI和HDF5,为处理和分析栅格数据提供了强大的工具。RasterIO适用于各种栅格数据应用,如卫星遥感、地图制作等。这篇文章跟大家介绍一下Rasterio库的安装以及一些基本函数的使用教程,附带源码。

Remote Sensing迷途小书童 1万+

python计算n的m次方_python实现n个数中选出m个数的方法

python实现n个数中选出m个数的方法题目:某页纸上有一个数列A,A包含了按照从小到大的顺序排列的多个自然数,但是因为一些原因,其中有M个连续的位置看不清了。这M个数左边最小的数是X,右边最大的数是Y,这些数之和大于等于P且小于等于Q。#请写程序,在输入M,X,Y,P,Q后自动给出所有可能的合法排列from itertools import combinations####第一步,题目给的数据输...

weixin_39928099的博客 1775

有史以来最小的GIF/png/jpg/jpeg

昨天我对图像进行了 base64 编码,这样我就可以将它发送到 CouchDB 以测试我正在为客户编写的一些代码。它让我想起了我之前在远程服务器上设置 cookie 时所做的事情。基本上,一个小的 PHP 脚本被放在远程服务器上,它接受几个 GET 参数并根据它们的值设置一些 cookie。然后脚本输出一个 1x1 的透明 GIF。本地服务器上的 PHP 脚本生成了一个 IMG 标签,该标签链接到该图像并根据本地服务器上的 COOKIES 设置参数。

凌凌1301的博客 1416

mac安全干净卸载Anaconda3

主要原因是python命令没有映射到已经安装的python版本上,则需要添加。修改~/.bash_profile文件,将anaconda相关删除。现在想卸载Anaconda,恢复使用mac系统自带的Python。最后在mac的应用目录删除Anaconda。查看所有版本的python所在安装目录。或者不使用软连接映射,也可使用。再次查看python映射。查看python版本。建立软连接,添加映射。

buyue 5961

Java刷题:最小k个数

Java通过小根堆/大根堆实现最小k个数

xiaochuan_bsj的博客 2790

UCIe相关开源项目记录

目前找到的和UCIe协议有关的5个开源项目,如果也有正在做的朋友,欢迎私信交流

m0_64102565的博客 822

找出N个元素的数组中最大的K个数

题目: 给出 N 个整数(N可能很大,以致无法装入内存),找出前 K 个最大的整数 【解法一】 如果 N 的数量不是很大,例如在几千个左右,则在这种情况下,那我们就先排序一下,这里快速排序或者推排序都是很好的解决方案,平均时间复杂度为 O(N * log2N)。然后取出前 K 个,O(K)。 总共时间复杂度 O(N * log2N)+ O(K) = O(N * log2N)。 当 K =

shuiziliu1025的博客 7347

QMT量化交易桥接方案深度对比:从MiniQMT淘汰说起

量化交易系统中的API桥接,本质是解决本地终端与底层交易引擎之间的通信瓶颈。其核心原理在于绕过GUI封装、直连确定性执行层,从而获得低延迟、高可靠、可监控的指令通路。技术价值体现在策略实盘一致性提升、毫秒级响应保障及运维可控性增强。典型应用场景包括打板策略、T+0套利、高频网格等对时效与稳定性双敏感的自动化交易。本文聚焦国金证券QMT专业版生态,系统剖析DLL注入、HTTP反向代理、IPC共享内存与官方HTTP API四大桥接路径的性能边界、合规风险与工程落地成本,尤其深入解析qmt终端 client is

weixin_33892359的博客 457

从零构建企业级多智能体系统:LangGraph 全流程实战 + 部署指南(含代码与架构图)

> 在大模型应用爆发的今天,如何构建一个可协作、可调试、可部署的多智能体系统?LangGraph 正在成为工程师的新宠。本文从原理剖析、流程建模、代码实战到前后端部署,手把手带你用 LangGraph 构建一个企业级 AI 助理系统,整合财务分析、法务审阅、报告生成与图表可视化等 Agent 模块,全面打通从用户输入到报告输出的全链路闭环。适合有工程思维的 AI 架构师、Agent 研发人员、以及大模型项目实践者。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3449

一般性选择问题(在N个数中选第K大或第K小)

问题:选第k小. 输入:数组S,S的长度n,正整数k(1 <= k <= n). 输出:第k小的数. 算法1:调用k次选最小算法,时间复杂度O(kn) 算法2:先排序,然后输出第k小的数,时间复杂度O(nlogn) 算法3:分治算法 下面我们来讨论算法3. 设计思想(假设数组中数据无重复): 用数组S中的某个元素m做标准将S划分成S1与S2,其中S1中的元素小于m,S2中的元素大于等于m 如果k <= |S1|,则在S1中找第k小。如果k == |S1| + 1,则m

m0_54123999的博客 1654

CODESYS无扰切换PID(ST源代码)

/运行信号//手自动切换//设置值、目标值yk : REAL;// 实际值、反馈信号;// 开环给定值;// 比例增益;// 积分时间 单位S;Td : REAL;// 微分时间 单位S;//采样时间 单位S// 滤波时间 单位S;//中断周期 默认10msEND_VARVAR_OUTPUT//uk : REAL;//控制器输出;//上一时刻的实际值;uDk : REAL;

RXXW_Dor的博客 1400

n个数里最小的k个

链接 来源:牛客网 [编程题]n个数里最小的k个 找出n个数里最小的k个 输入描述: 每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n 不超过100。 输出描述: 输出n个整数里最小的k个数。升序输出 示例 输入 3 9 6 8 -10 7 -11 19 30 12 23 5 输出 -11 -10 3 6 7 解题思路: 只要将得到的数组排序好然后输出前k个最小的元素就可以了,...

weixin_44376490的博客 502

基于Python的Steam游戏评论与销量数据爬取及预测分析

随着数字游戏市场的蓬勃发展,Steam作为全球最大的数字游戏分发平台,积累了海量的游戏数据与玩家行为数据。本文旨在通过Python网络爬虫技术,采集Steam平台的游戏基本信息、玩家评论数据及销量相关信息,为后续的游戏评论情感分析与销量预测模型构建提供数据支持。本文将详细介绍使用requestsselenium等库实现Steam数据爬取的全过程,并提供完整的代码实现与数据处理方法。关键词:Steam;Python爬虫;数据采集;评论分析;销量预测。

2201_76125261的博客 854

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

27 最小的k个数: 输入n个整数,找出其中最小的k个数。

一、题目 输入n个整数,找出其中最小的k个数。 例子说明: 例如输入4 、5 、1、6、2、7、3 、8 这8 个数字,则最小的4 个数字是1 、2、3 、4 解法一:O(n)时间算法,只有可以修改输入数组时可用。 可以基于Partition函数来解决这个问题。如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样调整之后,位于...

皮卡丘的博客 3321

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 电面:给一个数组找出和为k的两个数
下一篇: 求最长公共子串
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值