面試題57 - II. 和爲s的連續正數序列
思路: 滑動窗口
import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
int i = 1;
int j = 1;
int s = 0;
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
while(i <= sum/2){
if(s < sum){
s += j;
j++;
}else if(s > sum){
s -= i;
i++;
}else{
ArrayList<Integer> ans = new ArrayList<Integer>();
for(int m = i; m < j; m++){
ans.add(m);
}
res.add(ans);
s -= i;
i++;
}
}
return res;
}
}
面試題57 - I.和爲 s 的兩個數字
- 排序數組, 雙端指針逐漸逼近。
利用 HashMap 可以通過遍歷數組找到數字組合,時間和空間複雜度均爲 O(N) ;
注意本題的 nums是 排序數組 ,因此可使用 雙指針法 將空間複雜度降低至 O(1) 。
算法流程:
初始化: 雙指針 i,j 分別指向數組 nums 的左右兩端 (俗稱對撞雙指針)。
循環搜索: 當雙指針相遇時跳出;
計算和 s = nums[i] + nums[j]s=nums[i]+nums[j] ;
若 s > sum ,則指針 j 向左移動;
若 s < sum,則指針 i 向右移動;
若 s = sum ,立即返回數組 [nums[i], nums[j]];
返回空數組,代表無和爲 sum 的數字組合。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
int i = 0;
int j = array.length-1;
ArrayList<Integer> res = new ArrayList<Integer>();
while(i < j && i < sum && j < sum){
int s = array[i] + array[j];
if(s < sum) i++;
else if(s > sum) j--;
else{
res.add(array[i]);
res.add(array[j]);
break;
}
}
return res;
}
}