「指定した値より大きい先頭の要素を返す」関数だ。標準ライブラリの「Arrays.binarySearch()」も二分探索のライブラリだが、同じ値が並んでいるときは、返ってくる要素は不定になり、見つからなかった場合は負の値になる。これら関数は、基本的に見つかった値に対して、返ってくる要素(インデクス)が違うだけと考えて良い。今回は配列内の要素での探索に使う。<p>配列要素が0のときは、0が返る。<p>配列要素が0のときは、0が返る。ページにある「Subsequence」(部分列問題)のはじめの方の解法だ。以上となるようなもののうち、最小の長さを求めなさい。以上となる、先頭のインデクスを二分探索する」というアルゴリズムで解いている。これは要素がすべて正の数なら、その部分和は単調増加になるので、二分探索が適用できるというものだ。ans);}2といっても、この問題はその後にある「しゃくとり法」の方が、より効率が良いんだけどね。配列の中身がバラバラの数値(単調増加でない数列)だったので、部分和の二分探索は思い付かなかった。単純な全探索でも解けるけど、要素数が多いと計算量が間に合わないからね。解法は色々知っていて損はない。ライブラリがないとこの解法はすぐにはできないが...。これら2つの関数を組み合わせると、「同じ値の連続した区間」を高速に求めることができる。したとき、2つの関数の差分を取れば良い。個」あることを表している。使ったりすると、単調減少でも利用することができる。返る値は「見つかった値より後ろのインデクス」のようになるけどね。ほんの少し改造版も載せておこう。<p>配列要素が0のときは、0が返る。<p>配列要素が0のときは、0が返る。}});あとは、探索対象の開始と終了インデクスも引数に追加して、配列の一部のみの探索も可能にするといいね。この記事でのコードは1つ1つの関数で書いてしまっているけど、一番多く引数を持つ関数を1つだけ作って、あとは引数を変えた関数をオーバーロードをしてしまう方が楽だ。必要ならば自分で作ってみると良いだろう。使えば勝手にやってくれる。集計など、値でのソートをしたいことも多い。e.getValue()));構造としてはキーと値のペア(Map.Entry)のリストを作り、そのリストをソートしている感じ。要素はオブジェクトの参照なので、キーでも値でも取り出せる。匿名クラスで作ってるが、「2次元配列のソート」のときのように、独立したクラスとして定義して置いて、フラグで昇順・降順を切り替えるのも良いだろう。キーを逆順(降順)ソートしたい場合は、同じような考え方でできる。間に挟むと、色々操作しやすい。使うので、いくつか欲しい機能が無かったりするね。そのうちの1つなのだが、自作するのも簡単なので、2次元配列版も含めて作ってみた。}}配列の最初と最後の方から交換して、真ん中まで来たら終わりというアルゴリズム。わかりやすくて良いね。検索してたら再帰を使って反転するなんてものもあったが、練習問題としては良いが、実際に使わない方がいいね。ソートのときにも書いたが、再帰はメモリを喰うので、携帯やスマホみたいなメモリが小さい端末にはあまり良くない。再帰アルゴリズムの例として「階乗の計算」が挙げられるが、あれも実際には使わないしね。私はいつも単純明快でいきますよ(笑)。再帰アルゴリズム2次元の場合は横方向(列の入れ替え)と縦方向(行の入れ替え)が考えられるので、2通り用意した。方向の反転(arr[row][col])。長さの違う配列は基本的に不可。}}ソートのときと同じで、入れ替えを列での処理にしただけ。注意点としては、各行の長さが違う配列には対応してないことだ。するようにした方が良いだろう。方向の反転(arr[row][col])。}}縦方向の場合は、行をまるごと入れ替えているようなものなので(参照を入れ替えている)、各行の長さが違う配列でも構わない。配列ってネストしてるんだよね。