大家好,我是晴天学长,今天的算法题思想用到了二分和双指针,是考试中非常重要的两个常考点,今天这题恰好两种方法都可以去ok,所以我就记录了下来,题目不难,但是知识的思路的运用还是值得学习的,需要的小伙伴请自取哦!💪💪💪
1 )求出最多标记下标
2) .算法思路
二分
- 用二分去查找能获得的最大的那个k。
双指针
- 最多只能有num.length/2对,所以j从中间开始遍历。
3).代码示例
二分
public static class Solution {
public static int maxNumOfMarkedIndices(int[] nums) {
Arrays.sort(nums);
int l = 0, r = (nums.length / 2);
while (l < r) {
int mid = (r - l) / 2 + l + 1;
if (check(nums, mid)) {
l = mid;
} else r = mid - 1;
}
return r * 2;
}
private static boolean check(int[] nums, int mid) {
for (int i = 0; i < mid; i++) {
if (nums[i] * 2 > nums[nums.length - mid + i]) return false;
}
return true;
}
}
双指针
public static class Solution2 {
public static int maxNumOfMarkedIndices(int[] nums) {
Arrays.sort(nums);
int i = 0;
int j = nums.length / 2;
int sum = 0;
while (i < nums.length / 2 && j < nums.length) {
if (nums[i] * 2 <= nums[j]) {
sum+=2;
i++;
j++;
}
else j++;
}
return sum ;
}
}
4).总结
- 算法成对要从中间劈开(因为最多有length/2=k对),不能用二分去研究那个临界值,可能会越过中间,导致答案错误,这时取对半刚好是右边那半第一个的下标。e
- 一般情况下,题目答案不是很明确的在原来的数组上,都是要重新以题目范围开一个研究二段性的答案k。