Count subsets

package _interview_question

/**
 * https://leetcode.com/discuss/interview-question/275785/facebook-phone-screen-count-subsets
 *
 * Input:
Given an array A of
-positive
-sorted
-no duplicate
-integer
A positive integer k

Output:
Count of all such subsets of A,
Such that for any such subset S,
Min(S) + Max(S) = k
subset should contain atleast two elements

input: {1,2,3,4,5}
 * */
class Solution {

    private val map = HashMap<Int, Int>()
    private var result = 0.0

    fun subSetMinMaxEqualK(nums: IntArray, k: Int):Int {
        //1.backtracking, Time complexity: O(2^n), Space complexity:O(n)
        //dfs(0, nums, ArrayList<Int>(), k)

        //2.use map, just like 2 sum
        //Time complexity: O(nlogn), Space complexity:O(n)
        nums.sort()
        for (i in nums.indices) {
            val needFind = k - nums[i]
            if (map.containsKey(needFind)) {
                val value = i-map.get(needFind)!!-1
                //1,2,3,4,5; k = 5, {1 4} there are 4 cases 2^2
                result += Math.pow(2.0,value.toDouble())
            }
            map.put(nums[i], i)
        }
        return result.toInt()
    }

    private fun dfs(n: Int, nums: IntArray, cur: ArrayList<Int>, target: Int) {
        val temp = ArrayList<Int>(cur)
        val min = temp.min() ?: 0
        val max = temp.max() ?: 0
        val value = min + max
        if (value == target) {
            result++
        }
        for (i in n until nums.size) {
            cur.add(nums[i])
            dfs(i + 1, nums, cur, target)
            cur.removeAt(cur.size - 1)
        }
    }

}

 

posted @ 2020-05-24 23:53  johnny_zhao  阅读(102)  评论(0编辑  收藏  举报