Algorithm to calculate number of intersecting discs

前端 未结 30 1556
鱼传尺愫
鱼传尺愫 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:46

    My answer in Swift; gets a 100% score.

    import Glibc
    
    struct Interval {
        let start: Int
        let end: Int
    }
    
    func bisectRight(intervals: [Interval], end: Int) -> Int {
        var pos = -1
        var startpos = 0
        var endpos = intervals.count - 1
    
        if intervals.count == 1 {
            if intervals[0].start < end {
                return 1
            } else {
                return 0
            }
        }
    
        while true {
            let currentLength = endpos - startpos
    
            if currentLength == 1 {
                pos = startpos
                pos += 1
                if intervals[pos].start <= end {
                    pos += 1
                }
                break
            } else {
                let middle = Int(ceil( Double((endpos - startpos)) / 2.0 ))
                let middlepos = startpos + middle
    
                if intervals[middlepos].start <= end {
                    startpos = middlepos
                } else {
                    endpos = middlepos
                }
            }
        }
    
        return pos
    }
    
    public func solution(inout A: [Int]) -> Int {
        let N = A.count
        var nIntersections = 0
    
        // Create array of intervals
        var unsortedIntervals: [Interval] = []
        for i in 0 ..< N {
            let interval = Interval(start: i-A[i], end: i+A[i])
            unsortedIntervals.append(interval)
        }
    
        // Sort array
        let intervals = unsortedIntervals.sort {
            $0.start < $1.start
        }
    
        for i in 0 ..< intervals.count {
            let end = intervals[i].end
    
            var count = bisectRight(intervals, end: end)
    
            count -= (i + 1)
            nIntersections += count
    
            if nIntersections > Int(10E6) {
                return -1
            }
        }
    
        return nIntersections
    }
    

提交回复
热议问题