dd愛框框
實例:
輸入:
10 20
1 1 6 10 9 3 3 5 3 7
?輸出:
3 5
這道題要解決Java中輸入的數過多時,時間不足的的問題。
應用這個輸入模板即可解決:
Java中輸入大量數據
import java.util.*;
import java.io.*;public class Main {public static void main(String[] args) throws IOException {Read in = new Read();}
}class Read {StringTokenizer st = new StringTokenizer("");BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String next() throws IOException{while(!st.hasMoreTokens()) {st = new StringTokenizer(bf.readLine());}return st.nextToken();}String nextLine() throws IOException{return bf.readLine();}int nextInt() throws IOException{return Integer.parseInt(next());}Double nextDouble() throws IOException{return Double.parseDouble(next());}long nextLong() throws IOException{return Long.parseLong(next());}
}
稍微解釋一下代碼的作用,通過BufferedReader更改字節流輸入位字符流輸入,加速快字符的輸入
再通過StringTokenizer將輸入的字符串進行切割,用于下一步的轉換。
對于nextLine()這個方法由于輸入時是String得到的也是String,就可以直接返回BufferedReader
中讀取的字符串。
而對于其他比如nextInt()需要進行切割后用Integer.parseInt()轉化,所以統一把切割這一步封裝為next()。
st.hasMoreTokens()這個用于讀取多行,其他的就記住就行。
封裝完成后的使用方法與Scanner一致。
接下來講解這道題:
題解:
解法一:暴力解法
我做題如果不是熟悉的題,基本第一時間還是想到的暴力遍歷,然后再優化。
對于這道題來說,把所有情況統計下來,還要兼顧長度相同時,取最小的l的情況,無疑是不能通過的。那么如何進行優化呢?
有了之前這種題的經驗:數組中兩個字符串的最小距離,我想到繼續用臨時變量取存儲,然后再不斷更新,因此,我們現在就嘗試尋找滿足這樣的條件是什么。
要存儲那個變量呢?結果要輸出左右下標,那么這個肯定優先考慮,那么還有其他的需要考慮嗎,意識到要遍歷所有的情況,我們可以定義兩套變量,一套用于遍歷所有情況,一套用于存儲輸出結果,并且結合題目還要計算數組和,所以這個也要定義。
下面要考慮什么時候更新數據,當遍歷到的數據和滿足 >x時,判斷是否小于輸出結果記錄的值,然后更新,有點像雙指針的思路,從頭開始遍歷時,如果和大于x后就兩頭向內坍縮,但由于是向右遍歷的,那么右邊的就可以不用向回走(因為題目中要求的x一定是大于0的),比如1,2,3這一組數,如果x=5,那么左邊就可以減少一個,但是右邊就沒必要減,如果右邊也可以減,那么這組遍歷在1,2就會因為>x而停下。
代碼:
import java.util.*;
import java.io.*;public class Main {public static void main(String[] args) throws IOException {Read in = new Read();int n = in.nextInt();int x = in.nextInt();int[] arr = new int[n+1];for(int i = 1; i <= n; i++) {arr[i] = in.nextInt();}//記錄遍歷數據與輸出數據int l = 1, retl = -1;int r = 1, retr = -1;int count = 0;int ret = n;while(r <= n) {//統計和count += arr[r];while(count >= x) {//注意這個等號,恰好相等時也要更新//向內坍縮 雙指針if(r - l + 1 < ret) {//保證輸出的是l最小的retl = l;retr = r;ret = r-l+1;}count -= arr[l++];}r++;}System.out.println(retl + " " + retr);}
}class Read {StringTokenizer st = new StringTokenizer("");BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String next() throws IOException{while(!st.hasMoreTokens()) {st = new StringTokenizer(bf.readLine());}return st.nextToken();}String nextLine() throws IOException{return bf.readLine();}int nextInt() throws IOException{return Integer.parseInt(next());}Double nextDouble() throws IOException{return Double.parseDouble(next());}long nextLong() throws IOException{return Long.parseLong(next());}
}