LintCode每日一練 限制條件子集

2021-08-16 10:39:49 字數 1503 閱讀 1486

給乙個陣列,給定乙個target,求滿足以下條件的子集個數:

條件:子集中的最小值+最大值小於給定target。

給出 array = [1,5,2,4,3], target = 4, 返回 2。

解釋:只有子集[1],[1,2]滿足條件。所以答案是2

最容易想到的方案是:以[1,5,2,4,3]為例,先對陣列進行排序,

變成[1,2,3,4,5],然後從小到大列舉其可能的區間,[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5],[2,3],[2,3,4],[2,3,4,5]等等…,一旦發現區間的首尾和小於target,則子集總數加上2的(區間長度 - 2)次冪,然後再遍歷每個單個元素,每次有元素的兩倍小於target,則子集總數再加上1。**如下:

public

long

power(int exp)

return result;

}/**

*@param nums: the array

*@param target: the target

*@return: the number of subsets which meet the following conditions

*/public

long

subsetwithtarget(int nums, int target)

for ( int j = i + 1; j < nums.length; j++ )}}

return sum;

}

這裡也可以不用寫那個power函式,而是直接用左移運算(「<

提交,排名如下:

解法一其實做了一些多餘的運算,比如當我發現[1,2,3,4]滿足target時,那麼[1,2],[1,2,3]也是肯定滿足的,而且他們的和可以用等比數列求和公式直接算出,所以這個時候不需要乙個個判定,直接找到從某個數開始的最長區間,然後計算一下等比數列求和公式就可以了,**如下:

/**

*@param nums: the array

*@param target: the target

*@return: the number of subsets which meet the following conditions

*/public

long

subsetwithtarget(int nums, int target)

int rest = target - nums[i];

for ( int j = nums.length - 1; j > i; j-- )}}

return sum;

}

提交,排名上公升到第六名:

每日一練4

員工表emp 員工編號eid,姓名ename,工作職位title,僱傭日期hiretime,工資salary,獎金bonus,部門depart 部門表dept 部門編號did,名稱dname,部門領導leader 員工資料 1001,張三 銷售 1999 12 1 3000.0,1100.0,102...

每日一練25

請描述 mysql 從安裝到配置的全部詳細過程 確保一台新電腦可以順利使用 mysql mysql安裝嚮導啟動,按 next 繼續 選擇安裝型別,有 typical 預設 complete 完全 custom 使用者自定義 三個選項,我們選擇 custom 有更多的選項,也方便熟悉安裝過程 選擇配置...

每日一練 13

談談你對ajax 的理解?概念 特點 作用 select 教師號,sum case when 星期號 1 and 是否有課 有 then 1 else 0 end as 星期一,sum case when 星期號 2 and 是否有課 有 then 1 else 0 end as 星期二,sum c...