
我们需要在数组中找出最多可以标记的下标对数,标记规则是:每次选择两个未标记的下标i和j,满足2*nums[i] <= nums[j]。目标是最大化标记的下标总数。
排序数组:使用sort函数对输入数组排序
初始化指针:left指向前半部分,right指向后半部分
匹配过程:检查2*nums[left] <= nums[right],满足则计数并移动双指针
结果返回:最终返回标记的下标总数
class Solution {
public:
int maxNumOfMarkedIndices(vector<int>& nums) {
sort(nums.begin(), nums.end()); // 先对数组排序
int n = nums.size();
int left = 0, right = n / 2; // 将数组分为两半
int count = 0;
// 双指针法寻找匹配对
while (left < n / 2 && right < n) {
if (2 * nums[left] <= nums[right]) {
count += 2; // 找到一对,标记两个下标
left++;
right++;
} else {
right++; // 当前right不满足条件,尝试更大的right
}
}
return count;
}
};空数组:返回0
所有元素都相同:无法形成任何有效对
数组长度为奇数:后半部分比前半部分多一个元素
来源:力扣题解