劍指offer 57_和爲s的連續正數序列(java)

面試題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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章