和为S的两个数
题目
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
思考
- 注意题目的条件:有序数组
- 对于此题的条件,我们可以将 有序 的条件充分利用起来,是用双向指针解决
- 扩展,对于一般的无序数组:
- 是用 hash 表减小查找的复杂度,空间换时间,时间复杂度为 O(n)
- 可以先将数组排序然后是用双向指针求解,时间复杂度依赖于排序算法,因此最好的情况为 O(nlog(n))
code
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_set>
#include <limits>
using namespace std;
class Solution{
public:
vector<int> FindNumbersWithSum(vector<int> array, int sum){
//return FindNumbersWithSumHash(array, sum);
return FindNumbersWithSumSortedArray(array, sum);
}
// time-O(n), space-O(1)
// Note: the array must be sorted array.
vector<int> FindNumbersWithSumSortedArray(vector<int> array, int sum){
int left = 0, right = array.size()-1;
long long minimum = numeric_limits<int>::max();
int cond1, cond2;
while(left < right){
int curSum = array[left] + array[right];
if(curSum > sum)
right--;
if(curSum < sum)
left++;
if(curSum == sum){
long long mul = array[left] * array[right];
if(mul < minimum){
minimum = mul;
cond1 = array[left];
cond2 = array[right];
}
left++; // note: escape the duplication to avoid the infinite loop
}
}
if(minimum == numeric_limits<int>::max()){
return vector<int>();
}else{
vector<int> ans(2);
ans[0] = cond1;
ans[1] = cond2;
return ans;
}
}
// time-O(n) , space-O(n)
vector<int> FindNumbersWithSumHash(vector<int> array, int sum){
unordered_set<int> setNums;
long long minimum = numeric_limits<long long>::max();
int cond1, cond2;
for(int n : array){
int another = sum - n;
if(setNums.find(another) != setNums.end()){
if(another * n < minimum){
cond1 = n;
cond2 = another;
minimum = another*n;
}
}
setNums.insert(n);
}
if(minimum == numeric_limits<long long>::max()){
return vector<int>();
}else{
if(cond2 < cond1)
swap(cond1, cond2);
vector<int> ans(2);
ans[0] = cond1;
ans[1] = cond2;
return ans;
}
}
};
int main()
{
return 0;
}
和为S的两个数的更多相关文章
- Java数据结构与算法之---求两个数的最大公约数(欧几里得算法)
一个简单的小算法来获取两个数的最大公约数, public class Test { public static void main(String[] args) { long result = gcd ...
- JavaScript获取两个数之间的任意随机数
通过JavaScript的Math.random()方法可以获取0到1之间的任意随机数,那如何获取任意给定的两个数之间的随机数呢?如获取2和5之间的随机数,5和10之间的随机数等. 由于Math.ra ...
- shell实现两个数的相加
刚开始的时候写,一直写不对:看似简单的功能,但是一定要小心:函数的定义: funciton functionName {.....}在functionName和{之间一定有空格啊! 我就是没加空格,就 ...
- [猜数字]把两个数和告诉A,积告诉B,求这两个数是什么
1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少? 分析: 设和为S,积为M. 首先,A:我不知道. 说明:S可以分解成多个 ...
- java课后作业 弹出窗口求两个数的加减乘除
//计算2个数的加减乘除 谷伟华 2015/10/6package jisuan; import javax.swing.JOptionPane; public class Jiasuan { pub ...
- 创建一个LinkedList,然后在其中插入多个值,确保每个值都插入到List中间(偶数中间两个数之一,奇数在正中间)
这是Thinking in java 中的一道题,下面是我的解决方案: package test; import java.util.LinkedList; import java.util.List ...
- 求两个数的最大公约数(Java)
获得两个随机数(100以内),并放入数组中 public int[] getTwoRandom(){ int[] t = new int[2]; Random rand = new Random(); ...
- 和为S的两个数VS和为S的连续正数序列
其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧.时间复杂度肯定就是 O(n2)啰.但是这题目肯定不会这么简单,否则就是小学生的水平了嘛. 其实我刚到这题的时候想到的是用二叉查 ...
- C实现辗转相除法求两个数的最大公约数
什么是辗转相除法? 辗转相除法(又名欧几里德算法),它主要用于求两个正整数的最大公约数.是已知的最古老的算法. 用辗转相除法求132和72的最大公约数的步骤: 132 / 72 = 1 ... 60 ...
- java 判断两个数是否异号
java 整型int占4个字节32位,两个数异或后移动31位判断结果,如果是1则异号,如果是0则同号 public class ShowEnviromentViarible { public stat ...
随机推荐
- 深入浅出AQS之条件队列
相比于独占锁跟共享锁,AbstractQueuedSynchronizer中的条件队列可能被关注的并不是很多,但它在阻塞队列的实现里起着至关重要的作用,同时如果想全面了解AQS,条件队列也是必须要学习 ...
- 【笔记】php常用函数
phpusleep() 函数延迟代码执行若干微秒.unpack() 函数从二进制字符串对数据进行解包.uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.time_sleep_unti ...
- HDU1789 Doing Homework again
基础单调队列: #include<cstdio> #include<cstdlib> #include<iostream> #include<algorith ...
- ZOJ2105 终于找到错误
ZOJ2105:点击打开链接 错误代码 #include<stdio.h> #include<stdlib.h> int q[110]; int main() { int a, ...
- Jquery添加和全部删除
<html> <head> <meta charset="utf-8" /> <title></title> <s ...
- 部署LAMP+NFS实现双Web服务器负载均衡
一.需求分析 1.前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器: 2.虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台 ...
- 用FastDFS一步步搭建文件管理系统
一.FastDFS介绍 FastDFS开源地址:https://github.com/happyfish100 参考:分布式文件系统FastDFS设计原理 参考:FastDFS分布式文件系统 个人封装 ...
- 使用acs-engine在Azure中国区部署kubernetes集群详解
转载请注明出处:http://www.cnblogs.com/wayneiscoming/p/7649642.html 1. acs-engine简介 ACS是微软在2015年12月推出的一项基于容器 ...
- [译]ASP.NET Core 2.0 带初始参数的中间件
问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...
- 【转】C语言中内存分配
原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...