K - problem 问题
Leetcode 有几个题目, 分别是 2sum, 3sum(closest), 4sum 的求和问题和 single Number I II, 这些题目难点在于用最低的时间复杂度找到结果
2-sum
IO : 给定 vector 和 target, 从 vector 中寻找两个元素, 其和等于 target
思路
1. 哈希法. 先假设给定 vector 和 target 都不小于0. 设置 target 个桶(0...target-1), 把 vector 中的元素 e 放到第 (e%target) 个桶中. x+y = target. y 就在第 target- x%target 个桶中. 这样当寻找一个元素的另一半时, 只需要到特定的桶里去找了. 这种做法适合于target 不太大同时 vector 中的元素分布较为均匀时才比较好. 当vector 中有小于 0 的元素时, 就对所有元素和target同时加上 minValue.
2. 先排序后查找. 设置两个游标 cur1, cur2 分别指向数组的第一个和最后一个元素, 当 vector[cur1]+vector[cur2] > target 时, cur1++. 否则 cur2--, 直到找到和等于 target 的两个元素
3-sum
IO : 给定 vector 和 target, 从 vector 中寻找三个元素, 其和等于 target
思路
1. 把 3-sum 问题看成是 2-sum 问题的扩展. 先枚举第一个元素 e , 然后问题转化为从vector中找到两个元素, 其和等于 target-e.value
细节
1. 第一次做的时候, 我简单的在 3-sum 的函数中嵌套了个 2-sum 的代码. 因第一个元素已被枚举, 所以 2-sum 函数进行查找的时候加上了判断条件, 结果使得修改后的 2-sum
函数变得非常乱, 且有重复计算, debug 花了很长时间. 后来参考别人的代码, 发现只要外面一层 for(i) 循环, st = i+1, 里面用了 while(st<ed) 即可, 省去了很多判重语句. 判重语句是越少越好的
3-sum closest
IO : 给定 vector 和 target, 从 vector 中寻找三个元素, 其和最接近 target
思路
1. 这自然是 3-sum closest 的扩展, 只需要在 while 循环中加上一个记录当前/全局最小距离的两个变量即可
2. 我一直想把这个做法和二分逼近联系到一起, 不过还是证明不出. 我想这应该不算是二分逼近, 反倒是一个不停测试的过程
4-sum
IO : 给定 vector 和 target, 从 vector 中寻找四个元素, 其和等于 target
1. 预处理, 枚举 vector 中所有的二元和, 然后将题目转化为找出两个二元和, 其值等于 target
Single Number I
IO : Given an array of integers, every element appears twice except for one. Find that single one
思路
1. 每个元素出现两次, 那么两个元素相减, 最后剩下的就是所求. res = a[i] - res;
2. 将减法换成异或运算 res = a[i] ^ res;
Single Number II
IO : Given an array of integers, every element appears three times except for one. Find that single one
思路:
1. 设置一个 大小为 32 (int 为 4byte) 的桶, 若 integer 在第 i 位为1, 则第 i 个桶数字加 1. 最后, 把桶里不是 3 的倍数的那些 1 组合起来拼成结果
K - problem 问题的更多相关文章
- UVa10025 The ? 1 ? 2 ? ... ? n = k problem 数学思维+规律
UVa10025 ? 1 ? 2 ? ... ? n = k problem The problem Given the following formula, one can set operator ...
- UVa 10025: The ? 1 ? 2 ? ... ? n = k problem
这道题仔细思考后就可以得到比较快捷的解法,只要求出满足n*(n+1)/2 >= |k| ,且n*(n+1)/2-k为偶数的n就可以了.注意n==0时需要特殊判断. 我的解题代码如下: #incl ...
- UVa10025-The ? 1 ? 2 ? ... ? n = k problem
分析:因为数字之间只有加减变换,所以-k和k是一样的,都可以当成整数来考虑,只要找到最小的n满足sum=n*(n+1)/2>=k:且sum和k同奇同偶即可,做法是用二分查找,然后在就近查找 因为 ...
- YOURPHP的分页完整版
html代码 <?php print_r($ser['searchtype']);?> <select name="searchtype"> <opt ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
- UVA 10025 (13.08.06)
The ? 1 ? 2 ? ... ? n = k problem Theproblem Given the following formula, one can set operators '+ ...
- 剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)
题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 输入: 每个测试案例包括n+1行: 第一行为2 ...
- 剑指OFFER之把数组排成最小的数(九度OJ1504)
题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输 ...
- 【原创】UVAOJ水题10025解题报告
首先是原题,转自UVAOJ The ? 1 ? 2 ? ... ? n = k problem The problem Given the following formula, one can s ...
随机推荐
- Ngen.exe和本机映像缓存
本机映像生成器创建托管程序集的本机映像,并且将该映像安装到本地计算机的本机映像缓存中.本机映像缓存是全局程序集缓存的保留区域.一旦您为某个程序集创建了本机映像,运行库在每次运行该程序集时就会自动使用该 ...
- linux tail -f 和 tail -F的区别 && tail 的断点续传
bash-1中启动如下进程while [ "true" ] ; do date >> test.log; sleep 1 ; done; bash-2中,tail -f ...
- 解决Xshell中文乱码问题
文件====>属性==>中断===>编码===>选择utf8编码
- Hdu1163 Eddy's digitai Roots(九余数定理)
题目大意: 给定一个正整数,根据一定的规则求出该数的“数根”,其规则如下: 例如给定 数字 24,将24的各个位上的数字“分离”,分别得到数字 2 和 4,而2+4=6: 因为 6 < 10,所 ...
- c++之---初探重载操作符
#include<iostream> using namespace std; class Test { friend Test addTest(Test &obj1, Test ...
- 拦截iOS系统导航栏返回按钮事件-三种方法
方法一:在dealloc里面书写监听事件,因为只有pop才会调用dealloc,push不会掉用 - (void)dealloc {YLLog(@"123"); } 方法二:在- ...
- laravel 连接mongodb
In this article we will see how to use MongoDB with Laravel (PHP framework). So first we need to ins ...
- draw sin
draw sin Steps 导入包 生成X轴,Y轴的数据点 设置输出图大小,像素,前景色 指定线宽,线型,绘制曲线 设置坐标轴范围 显示图形. Code #!/usr/bin/env python ...
- signal(SIGPIPE, SIG_IGN) (转)
signal(SIGPIPE, SIG_IGN) 当服务器close一个连接时,若client端接着发数据. 根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会 ...
- Android——控件AutoCompleteTextView 自动提示
Android:控件AutoCompleteTextView 自动提示 在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextV ...