Annettuna on lista kokonaislukuja, ja tehtäväsi on laskea, monellako tavalla voit halkaista listan kahteen osaan niin, että jokainen vasemman osan alkio on pienempi kuin jokainen oikean osan alkio.
Esimerkiksi listassa [2,1,2,5,7,6,9] tapoja on 3:
- [2,1,2] ja [5,7,6,9]
- [2,1,2,5] ja [7,6,9]
- [2,1,2,5,7,6] ja [9]
Voit olettaa, että jokainen luku on välillä 1 \dots 10^9 ja listalla on enintään 10^5 lukua. Tavoitteena on, että algoritmin aikavaativuus on O(n).
Python
Toteuta tiedostoon splitlist.py
funktio count
, joka antaa tapojen määrän.
def count(t): # TODO if __name__ == "__main__": print(count([1,2,3,4,5])) # 4 print(count([5,4,3,2,1])) # 0 print(count([2,1,2,5,7,6,9])) # 3 print(count([1,2,3,1])) # 0
Java
Toteuta tiedostoon SplitList.java
metodi count
, joka antaa tapojen määrän.
public class SplitList { public int count(int[] t) { // TODO } public static void main(String[] args) { SplitList s = new SplitList(); System.out.println(s.count(new int[] {1,2,3,4,5})); // 4 System.out.println(s.count(new int[] {5,4,3,2,1})); // 0 System.out.println(s.count(new int[] {2,1,2,5,7,6,9})); // 3 System.out.println(s.count(new int[] {1,2,3,1})); // 0 } }