Rumah > Java > javaTutorial > teks badan

Carian Binari

王林
Lepaskan: 2024-07-24 10:46:41
asal
940 orang telah melayarinya

Binary Search

Median dua tatasusunan tersusun

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        //merge these two arrays and find the median of the newly sorted array
        int arr[] = new int[nums1.length + nums2.length];

        sort(nums1,nums2,arr);
        return findMedian(arr);
    }
    public double findMedian(int arr[]){
        int mid = arr.length/2;
        if(arr.length %2!=0){

            return (double)arr[mid];
        }
        else{
            return (double)((double)(arr[mid]+arr[mid-1])/2);
        }
    }
    public void sort(int a[], int b[], int arr[]){
        int p = 0;
        int q = 0;
        int k =0;
        while(p<a.length && q < b.length){
            if(a[p]<b[q]){
                arr[k] = a[p++];
            }
            else{
                arr[k] = b[q++];
            }
            k++;
        }
        while(p<a.length){
            arr[k++] = a[p++];
        }
        while(q<b.length){
            arr[k++] = b[q++];
        }
    }
}
Salin selepas log masuk

Peruntukkan buku

Penjelasan:

diberikan :

Input: ‘n’ = 4 ‘m’ = 2
‘arr’ = [12, 34, 67, 90]
Salin selepas log masuk

kami diberi senarai buku arr, di mana arr[i] mempunyai halaman dalam buku i

kami diberikan m pelajar juga, kita perlu memperuntukkan buku supaya semua buku diedarkan secara bersambung di kalangan m pelajar (buku yang sama tidak diberikan kepada dua pelajar)

kini terdapat banyak pengedaran buku yang bersebelahan

katakan arr = [12, 34, 67, 90] dan m = 2

Kami, akan mempunyai dua partition arr

seperti 12|34,67,90 > pelajar 1 akan mempunyai 12 muka surat, pelajar 2 akan mempunyai 191 muka surat

atau 12,34| 67,90 > pelajar 1 akan mempunyai 55 muka surat, pelajar 2 akan mempunyai 157 muka surat

atau

12,34,67|90 > pelajar 1 akan mempunyai 113 muka surat, pelajar 2 akan mempunyai 90 muka surat

di antara semua pengedaran, maksimum minimum no. daripada halaman yang diperuntukkan ialah 113

Intuisi:

Kita perlu memilih no minimum. halaman yang boleh dipegang oleh pelajar supaya semua pelajar mendapat sekurang-kurangnya satu buku

Dalam contoh yang diberikan, kiraan halaman maks ialah 90, ini boleh menjadi halaman min yang perlu dipegang oleh pelajar ( jika tidak buku dengan halaman 90 tidak boleh dipegang oleh mana-mana pelajar)

sekarang kita akan cuba lihat sama ada ia adalah no minimum maksimum. halaman atau tidak

[12, 34, 67, 90], pelajar = 2

lelaran 1 dengan 90:

untuk pelajar 1

12+34<90 benar, tetapi 12+34+67 >90 maka pelajar 1 akan memegang 12+34 = 46 muka surat

untuk pelajar 2

67+90 > 90 maka pelajar 2 akan memegang 67 muka surat

Tetapi ada satu buku dengan 90 muka surat yang tinggal untuk ini diperuntukkan kami memerlukan pelajar lain

Ini akan meningkatkan kiraan pelajar kepada 3, yang tidak mungkin

Oleh itu, buku minimum maksimum tidak boleh 90

Kami akan mencuba dengan Lelaran 91,92,………MaxMinPage melainkan kami menemui halaman min maks yang boleh digunakan untuk menetapkan semua buku kepada semua 2 pelajar yang akan menjadi jawapan kami

nota: kita tidak boleh meneruskan selama-lamanya …kita perlu berhenti pada beberapa kiraan halaman dengan betul, jadi kiraan halaman maks ialah jumlah(arr)

//for more details refer : https://youtu.be/Z0hwjftStI4?t=1412 for binary search
///brute force:
//tc: O(sum-max)*n
import java.util.*;
public class Solution {
    public static int findPages(ArrayList<Integer> arr, int n, int m) {
        if(m>n) return -1;

        // brute force
        int maximum = Integer.MIN_VALUE;
        int sum =0;
        for(int i : arr){
            maximum = Integer.max(i,maximum);
            sum+=i;
        }

        for(int max = maximum;max<=sum;max++){
            int student = allocate(max,arr);
            if(student ==m) return max;
        }
        return -1;
    }
    public static int allocate(int pages, ArrayList<Integer> arr){

        int student =0;
        int currentPagesForStudent =0;
        for(int i =0;i<arr.size();i++){

            if(currentPagesForStudent+arr.get(i)<=pages){
                currentPagesForStudent+=arr.get(i);
            }
            else{
                currentPagesForStudent = arr.get(i);
                student++;
            }
        }
        return student+1;

    }
}

///binary search://tc : O((log(sum-maximum-1)*(n)), where n is the arr.size()

import java.util.*;
public class Solution {
    public static int findPages(ArrayList<Integer> arr, int n, int m) {
        // book allocation impossible
        if (m > n)
            return -1;

        int low = Collections.max(arr);
        int high = arr.stream().mapToInt(Integer::intValue).sum();
        while (low <= high) {
            int mid = (low + high) / 2;
            int students = allocate(mid,arr);
            if (students > m) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return low;
    }
    public static int allocate(int pages, ArrayList<Integer> arr){

        int student =0;
        int currentPagesForStudent =0;
        for(int i =0;i<arr.size();i++){

            if(currentPagesForStudent+arr.get(i)<=pages){
                currentPagesForStudent+=arr.get(i);
            }
            else{
                currentPagesForStudent = arr.get(i);
                student++;
            }
        }
        return student+1;

    }
}

Salin selepas log masuk

Atas ialah kandungan terperinci Carian Binari. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!