[剑指Offer]57-和为s的数字
题目一
输入一个递增的数组和一个数字,在数组中查找2个数字,是他们的和正好为S,如果有多对的和为S,则输出任意一对即可。
题解
关键信息是数组有序。初始化i,j指向第一个和第二个数,与S比较,若小了,--j,若大了,++i。舍弃掉的元素表示它再也不能和别的数相加等于目标数了,充分利用了有序性。时间复杂度O(n)。
代码
import java.util.ArrayList;
public class Main {
public static void main(String args[]) {
int[] arr= {1,2,4,7,11,15};
int sum=15;
ArrayList<Integer> ansList=findNumbersWithSum(arr,sum);
if(ansList!=null) {
System.out.println(ansList);
}
else {
System.out.println("none");
}
}
public static ArrayList<Integer> findNumbersWithSum(int [] array,int sum) {
if(array.length<2) {
return null;
}
int i=0;
int j=array.length-1;
while(i<j) {
if(array[i]+array[j]==sum) {
break;
}
else if(array[i]+array[j]<sum) {
++i;
}
else {
--j;
}
}
if(i!=j) {
ArrayList<Integer> list=new ArrayList<>();
list.add(array[i]);
list.add(array[j]);
return list;
}
else {
return null;
}
}
}
题目二
输入一个正数s,打印出所有和为s的连续正数序列(至少包含2个数。
题解
- 利用题目一的思路,只不过注意本题是连续个数>=2个数即可。初始化num1=1,num2=2,num1代表较小的数。和目标和比较,若大了++num2,等于在和上+了num2;若小了++num1,等于在和上-了num1。
- 注意终止条件是num1<(1+s)/2。
- 自己算的时间复杂度应该是O(n^2)。
代码
import java.util.ArrayList;
public class Main {
public static void main(String args[]) {
int sum=15;
ArrayList<ArrayList<Integer>> list=findContinuousSequence(sum);
if(list!=null) {
for(ArrayList<Integer> seq:list) {
for(int num:seq) {
System.out.print(num);
}
System.out.println("\n");
}
}
else {
System.out.print("null");
}
}
public static ArrayList<ArrayList<Integer>> findContinuousSequence(int sum) {
if(sum<3) {
return null;
}
int i=1;
int j=2;
int s=i+j;
ArrayList<ArrayList<Integer>> sequenceList=new ArrayList<>();
while(i<(1+sum)/2) {//
if(s==sum) {
sequenceList.add(getAnsList(i,j));
++j;
s+=j;
}
else if(s<sum) {
++j;
s+=j;
}
else {
s-=i;//注意顺序
++i;//
}
}
return sequenceList;
}
public static ArrayList<Integer> getAnsList(int i,int j){
ArrayList<Integer> list=new ArrayList<>();
for(int num=i;num<=j;++num) {
list.add(num);
}
return list;
}
}
[剑指Offer]57-和为s的数字的更多相关文章
- 剑指 Offer 57 - II. 和为s的连续正数序列 + 双指针 + 数论
剑指 Offer 57 - II. 和为s的连续正数序列 Offer_57_2 题目描述 方法一:暴力枚举 package com.walegarrett.offer; /** * @Author W ...
- 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针
剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...
- 力扣 - 剑指 Offer 57. 和为s的两个数字
题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...
- 力扣 - 剑指 Offer 57 - II. 和为s的连续正数序列
题目 剑指 Offer 57 - II. 和为s的连续正数序列 思路1(双指针/滑动窗口) 所谓滑动窗口,就是需要我们从一个序列中找到某些连续的子序列,我们可以使用两个for循环来遍历查找,但是未免效 ...
- 剑指Offer:旋转数组的最小数字【11】
剑指Offer:旋转数组的最小数字[11] 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4 ...
- 剑指Offer(三十七):数字在排序数组中出现的次数
剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...
- ⛅剑指 Offer 11. 旋转数组的最小数字
20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...
- [剑指 Offer 11. 旋转数组的最小数字]
[剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5, ...
- 剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...
- 菜鸟刷题路:剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 哈希表/set class Solution { public int findRepeatNumber(int[] nums) { HashSet< ...
随机推荐
- python设计模式之命令模式
python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...
- 浏览器自动化的一些体会11 webclient的异步操作
原来的代码大致如下: private void foo(string url) { using (WebClient client = new WebClient()) { client.Downlo ...
- Jmeter 常用函数(8)- 详解 __MD5
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 将指定的字符串 MD5 加密并返回,加 ...
- Overcoming Forgetting in Federated Learning on Non-IID Data
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 以下是对本文关键部分的摘抄翻译,详情请参见原文. NeurIPS 2019 Workshop on Federated Learning ...
- python编程中的并发------多线程threading模块
任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time. ...
- 如何在Linux上使用xargs命令
大家好,我是良许. 在使用 Linux 时,你是否遇到过需要将一些命令串在一起,但是其中一个命令不接受管道输入的情况呢?在这种情况下,我们就可以使用 xargs 命令.xargs 可以将一个命令的输出 ...
- 区块链入门到实战(22)之以太坊(Ethereum) – 账号(地址)
作用: 外部账号 – 用户使用的账号,账户余额. 合约账号 – 智能合约使用的账号,每个智能合约都有一个账号,内存和账户余额 以太坊(Ethereum)网络中,有2种账号: 外部账号 – 用户使用的账 ...
- SLS案例中心
今日PV nginx日志查看今日的PV和昨日的对比,先通过count函数计算总的pv,再用compare函数得出今日的pv和昨日的同比. 通过单值图进行展示,显示值为20.381Mil,对比值为-2% ...
- 3、Entity Framework Core 3.1入门教程-设定字段属性
本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...
- Spring Cloud系列(一):微服务架构简介
一.微服务概述 1.微服务是什么 微服务架构的核心就是服务的拆分,把传统的单体式应用,根据一定的维度(比如业务)拆分为一个一个的服务,每一个服务都有自身特定的功能,又都能够独立的部署,甚至可以拥有自己 ...