Algorithm to calculate number of intersecting discs

前端 未结 30 1584
鱼传尺愫
鱼传尺愫 2020-12-12 10:57

Given an array A of N integers we draw N discs in a 2D plane, such that i-th disc has center in (0,i) and a radius

30条回答
  •  北荒
    北荒 (楼主)
    2020-12-12 11:30

    An Implementation of Idea stated above in Java:

    public class DiscIntersectionCount {
    
    
    public int number_of_disc_intersections(int[] A) {
        int[] leftPoints = new int[A.length];
        for (int i = 0; i < A.length; i++) {
            leftPoints[i] = i - A[i];
        }
    
        Arrays.sort(leftPoints);
    //      System.out.println(Arrays.toString(leftPoints));
        int count  = 0;
        for (int i = 0; i < A.length - 1; i++) {
            int rpoint = A[i] + i;
    
            int rrank = getRank(leftPoints, rpoint);
    
            //if disk has sifnificant radius, exclude own self
            if (rpoint > i) rrank -= 1;
            int rank = rrank; 
    //          System.out.println(rpoint+" : "+rank);
    
            rank -= i;
            count += rank;
        }
        return count;
    
    }
    
    public int getRank(int A[], int num) {
        if (A==null || A.length == 0) return -1;        
        int mid = A.length/2;
        while ((mid >= 0) && (mid < A.length)) {
    
            if (A[mid] == num) return mid;
    
            if ((mid == 0) && (A[mid] > num)) return -1;
            if ((mid == (A.length - 1)) && (A[mid] < num)) return A.length;
            if (A[mid] < num && A[mid + 1] >= num) return mid + 1;
            if (A[mid] > num && A[mid - 1] <= num) return mid - 1;
    
            if (A[mid] < num) mid = (mid + A.length)/2;
            else  mid = (mid)/2;
    
        }
    
        return -1;
    }
    
    public static void main(String[] args) {
        DiscIntersectionCount d = new DiscIntersectionCount();
        int[] A = 
            //{1,5,2,1,4,0}
            //{0,0,0,0,0,0}
        //  {1,1,2}
        {3}
         ;
        int count = d.number_of_disc_intersections(A);
        System.out.println(count);
    }
    }
    

提交回复
热议问题