和為S的兩個數字 & 和為S的連續正數序列
一. 和為S的兩個數字
題目:
輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,是的他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。
解題思路:
1.定義兩個指標,分別指向第一個數字和最後一個數字;
2.如果兩個指標所指向的數的和等於S, 如果這兩個數的乘積小於之前找到的結果就替換掉舊的結果;
3.如果兩個指標所指向的數的和大於S,則第二個指標減減;
4.如果兩個指標所指向的數的和小於S,則第一個指標加加;
java實現:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> res = new ArrayList<Integer>();
int minVal = Integer.MAX_VALUE;
int num1 = Integer.MIN_VALUE;
int num2 = Integer.MAX_VALUE;
int i = 0, j = array.length - 1;
while (i < j){
if(array[i] + array[j] == sum){
if(array[i] * array[j] < minVal){
minVal = Math.min(minVal, array[i] * array[j]);
num1 = array[i];
num2 = array[j];
}
i++;
j--;
}else if(array[i] + array[j] < sum){
i ++;
}else{
j --;
}
}
if(num1 + num2 == sum){
res.add(num1);
res.add(num2);
}
return res;
}
}
二. 和為S的連續正數序列
題目:
輸入一個正數s,打印出所有和為s的連續整數序列(至少含有兩個數)。例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以結果打印出3個連續序列1~5、4~6和7~8。
注:美團暑期實習1面問到了這個題
解題思路:
解法一:數學解法
解題思路:
設有a個連續的正整數,從b(b>0)開始,和為S。
b + b + 1 + b + 2 + … + b + a -1 = S
ab + a(a-1)/2 = S
a(2b + a - 1) = 2S
因為a,b屬於整數,所以2S能整除a
所以列舉2S的約數記為a,時間複雜度
java實現:
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
for(int a = 2; a * a < 2 * sum; a ++){ //有a個連續的整數
if(2*sum % a == 0){//a是2*sum的約數
if((2*sum + a - a*a) / (2 * a) > 0 && (2*sum + a - a*a) % (2 * a) == 0){
ArrayList<Integer> al = new ArrayList<Integer>();
for(int i = (2*sum + a - a*a) / (2 * a); i < ((2*sum + a - a*a) / (2 * a) + a); i ++){
al.add(i);
}
res.add(0, al);
}
}
}
return res;
}
}
解法二:
解題思路:
1.用兩個整數small和big分別表示序列的最小值和最大值,small初始化為1,big初始化為2。
2.如果從small到big的和大於s,從序列中去掉最小值,即增大small的值。
3.如果從small到big的和小於s,增大big,讓這個序列包含更多的數字,因為至少含有兩個數字。
4.如果從small到big的和等於s,列印,之後增大big。
5.small增加到(1+sum)/ 2為止。
本題技巧:
通常我們用迴圈求一個連續序列的和,但考慮到每一次操作之後的序列和操作之前的序列相比大部分數字都是一樣的,只是增加或者減少了一個數字,因此,本題在前一個序列的和的基礎上求操作之後的序列的和。減少了不必要的運算,提高了程式碼的效率。
java實現:
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
int small = 1, big = 2;
int curSum = small + big;
while(small < ((sum + 1) / 2)){
if(curSum <= sum){
if(curSum == sum){
ArrayList<Integer> list = new ArrayList<Integer>();
int i = small;
while(i <= big){
list.add(i);
i ++;
}
res.add(list);
}
big ++;
curSum += big;
} else {
curSum -= small;
small ++;
}
}
return res;
}
}
相關推薦
和為S的兩個數字/和為S的連續正數序列
1.和為S的兩個數字,牛客網ac 其實同leetcode第一題兩數之和一樣, 雙指標,從兩邊逼近。 class Solution { public: vector<int> FindNumbersWithSum(vector<int>
和為S的兩個數字 & 和為S的連續正數序列
一. 和為S的兩個數字 題目: 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,是的他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 解題思路: 1.定義兩個指標,分別指向第一個數字和最後一個數字; 2.如果兩個指
java--Fibonacc由數字1、1、2、3...組成的,從第三個數字起每一個數字為前兩個數字的和。建立一個方法,接受一個整數引數,顯示從第一個元素開始總共由該引數指定的個數所構成的所有斐波那契數
題目完整描述:一個斐波那契數列是由數字1、1、2、3、5、8、13、21、34等等組成的,其中每一個數字(從第三個數字起)都是前兩個數字的和。建立一個方法,接受一個整數引數,並顯示從第一個元素開始總共由該引數指定的個數所構成的所有斐波那契數字。例如,如果執行 java Fibonacci 5(Fib
和為s的兩個數字
最小 else 初始化 air 應該 small ++ while iterator 牛客上要求返回乘積最小的,實際上不用麻煩去寫另外一個函數,第一次找到兩個數字的乘積就一定是最小的。 在調試程序時也遇到兩個問題: 1.既然用到了vector容器,頭文件就應該聲明#inc
42、和為S的兩個數字
new util pan arraylist 和為s的兩個數字 pre numbers 查找 [] 一、題目 輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,是的他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 二、解法 1 import j
python 和為S的兩個數字
enumerate body class div clas spa enum 代碼 循環 輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,是的他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 運用到的知識; 1.判斷是否是統一類型:
和為s的兩個數字 java
和為s的兩個數字 java 題目描述 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 輸出描述: 對應每個測試案例,輸出兩個數,小的先輸出。 程式碼1: import java.u
劍指offer -- 和為 S 的兩個數字
題目描述 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 AC程式碼 思路雖然很簡單,但是需要注意的地方有很多。 繼續努力。 import java.util.ArrayList; public
劍指offer系列(十五)和為S的連續正數序列,和為s的兩個數字,左旋轉字串
和為S的連續正數序列 題目描述 小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現
劍指Offer值和為S的兩個數字
題目描述 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 思路 l表示左側位置,r表示右側位置。不斷向中間靠攏,如果array[l]+array[r] == sum,則找到正確結果,如果l>
劍指offer 面試題41:和為s的兩個數字vs和為s的連續正數序列 c++
題目:輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 思路:兩個 指標,start從前往後遍歷,end從後往前遍歷,如果當前前後之和大於s,end--,如果當前前後之和小於s,start++,這樣能找出乘積最小的和
劍指offer 42. 和為s的兩個數字
原題 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 輸出描述: 對應每個測試案例,輸出兩個數,小的先輸出。 Reference Answer 思路分析 設定兩個指標,一個指向陣列的起點
《劍指offer》系列 和為S的兩個數字(Java)
連結 牛客:和為S的兩個數字 題目描述 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 輸出描述: 對應每個測試案例,輸出兩個數,小的先輸出。 思路 初始化兩個指標分別是第一個和
(劍指offer)和為S的兩個數字
時間限制:1秒 空間限制:32768K 熱度指數:153416 題目描述 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 輸出描述: 對應每個測試案例,輸出兩個數,小的先輸出。 import jav
劍指offer:和為S的兩個數字
class Solution { public: vector<int> FindNumbersWithSum(vector<int> array,int sum)
劍指Offer-57 和為S的兩個數字
題目: 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 輸出描述: 對應每個測試案例,輸出兩個數,小的先輸出。 解答: # -*- coding:utf-8 -*- class Solution(o
面試題57(一):和為s的兩個數字
一、題目 輸入一個遞增排序的陣列和一個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。 二、關鍵 1.兩個指標,一個指向頭一個指向尾,按照規則向中間靠攏。 三、解釋 四、程式碼 #include <cstdio&
劍指offer-42:和為S的兩個數字
題目描述 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 輸出描述: 對應每個測試案例,輸出兩個數,小的先輸出。 思路 還是雙指標問題 數列滿足遞增,設兩個頭尾兩個指標i和j, 若ai
[劍指offer] 42. 和為S的兩個數字
題目描述 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 輸出描述: 對應每個測試案例,輸出兩個數,小的先輸出。 思路:左右指標夾逼 class Solution { publ
27 和為S的兩個數字
0 引言 題目描述:輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 1 抽象問題具體化 舉例: 序列為{1,2,3,4,5,6,7,8,9}, 和為10 解答:如下圖所示,一頭一尾兩個指標分別運動,找到和為10