2824. 統計和小于目標的下標對數目
2824. 統計和小于目標的下標對數目
代碼倉庫地址: https://github.com/slience-me/Leetcode
個人博客 :https://slienceme.xyz
給你一個下標從 0 開始長度為 n
的整數數組 nums
和一個整數 target
,請你返回滿足 0 <= i < j < n
且 nums[i] + nums[j] < target
的下標對 (i, j)
的數目。
示例 1:
輸入:nums = [-1,1,2,3,1], target = 2
輸出:3
解釋:總共有 3 個下標對滿足題目描述:
- (0, 1) ,0 < 1 且 nums[0] + nums[1] = 0 < target
- (0, 2) ,0 < 2 且 nums[0] + nums[2] = 1 < target
- (0, 4) ,0 < 4 且 nums[0] + nums[4] = 0 < target
注意 (0, 3) 不計入答案因為 nums[0] + nums[3] 不是嚴格小于 target 。
示例 2:
輸入:nums = [-6,2,5,-2,-7,-1,3], target = -2
輸出:10
解釋:總共有 10 個下標對滿足題目描述:
- (0, 1) ,0 < 1 且 nums[0] + nums[1] = -4 < target
- (0, 3) ,0 < 3 且 nums[0] + nums[3] = -8 < target
- (0, 4) ,0 < 4 且 nums[0] + nums[4] = -13 < target
- (0, 5) ,0 < 5 且 nums[0] + nums[5] = -7 < target
- (0, 6) ,0 < 6 且 nums[0] + nums[6] = -3 < target
- (1, 4) ,1 < 4 且 nums[1] + nums[4] = -5 < target
- (3, 4) ,3 < 4 且 nums[3] + nums[4] = -9 < target
- (3, 5) ,3 < 5 且 nums[3] + nums[5] = -3 < target
- (4, 5) ,4 < 5 且 nums[4] + nums[5] = -8 < target
- (4, 6) ,4 < 6 且 nums[4] + nums[6] = -4 < target
提示:
1 <= nums.length == n <= 50
-50 <= nums[i], target <= 50
方案1:暴力解
第一種純暴力解,遍歷替換
class Solution {
public:int countPairs(vector<int>& nums, int target) {int sum=0;for (int i = 0; i < nums.size(); ++i){for (int j = i+1; j < nums.size(); ++j){if (i < j && nums[i]+nums[j]<target){sum+=1;}}}return sum;}
};
執行用時分布 4ms 擊敗89.43%使用 C++ 的用戶
消耗內存分布20.30MB 擊敗15.83%使用 C++ 的用戶
方案2
優化,采用類似快排的方法,進行計數
你可以使用雙指針的方法來解決這個問題。首先對數組進行排序,然后使用雙指針,一個指向數組的開頭,另一個指向數組的末尾,逐步向中間移動并計算對應的數對滿足條件的數量。
class Solution {
public:int countPairs(vector<int>& nums, int target) {// [-6,2,5,-2,-7,-1,3]sort(nums.begin(), nums.end());//先排序int ans = 0, left = 0, right = nums.size() - 1; //定義左索引,定義右索引while (left < right) { //快排常見的條件 左側索引<右側索引// [-7,-6,-2,-1,2,3,5]// -7 + 5 = -2 < -2 right--// -7 + 3 = -4 < -2if (nums[left] + nums[right] < target) { ans += right - left; //增加全部滿足條件的個數left++;} else {right--;}}return ans;}
};
執行用時分布 0ms 擊敗100.00%使用 C++ 的用戶
消耗內存分布 20.39MB 擊敗7.44%使用 C++ 的用戶