第九课 ★540. 有序数组中的单一元素 1996. 游戏中弱角色的数量
★540. 有序数组中的单一元素
Leetcode
class Solution:
def singleNonDuplicate(self, nums: List[int]) -> int:
# # 1 O(n)
# for i in range(0, len(nums) - 1, 2):
# if nums[i] != nums[i + 1]:
# return nums[i]
# return nums[-1] # 最后一个元素
# # 2 O(n) 相向双指针 左右收敛
i, j = 0, len(nums) - 1
# while i < j:
# if nums[i] != nums[i+1]: return nums[i]
# if nums[j] != nums[j-1]: return nums[j]
# i += 2
# j -= 2
# return nums[i]
# # 3 符合题意 O(log n) 二分法
while i < j:
mid = (i + j) // 2
'''
# mid -= mid & 1 # even 不变,odd 减一,统一为偶数。
# if nums[mid] == nums[mid + 1]: i = mid + 2
'''
if nums[mid] == nums[mid ^ 1]: i = mid + 1 # even +1 odd -1 统一奇偶
else: j = mid
return nums[i]
class Solution {
public int singleNonDuplicate(int[] nums) {
int res = 0, n = nums.length;
int i = 0, j = n - 1;
while (i < j){
int mid = (i + j) / 2;
// 目标下标 x 一定是 even;
// even 和后一个比较, odd 和前一个比较。
// even:mid ^ 1 = mid + 1(后一个), odd:mid ^ 1 = mid - 1(前一个)
if (nums[mid] == nums[mid ^ 1]){
i = mid + 1; // x > mid
/*
mid -= mid & 1; // odd: 变前一个
if (nums[mid] == nums[mid + 1]){
i = mid + 2; // 下一个 even
*/
} else j = mid; // x <= mid
}
return nums[j]; // i = j
}
}
1996. 游戏中弱角色的数量
Leetcode
记录遍历过的最大的防御力(maxdef)的角色 A,如果当前的角色 B 的防御力小于 maxdef,那么 B 的攻击力一定也小于 A 的攻击力。
class Solution:
def numberOfWeakCharacters(self, properties: List[List[int]]) -> int:
res = 0
properties.sort(key=lambda x: (-x[0], x[1]))
maxdef = 0
for _, d in properties:
if maxdef > d: res += 1
else: maxdef = d
return res
class Solution {
public int numberOfWeakCharacters(int[][] properties) {
int maxdef = 0, res = 0;
Arrays.sort(properties, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);
for (int[] role : properties){
if (maxdef > role[1]) res ++;
else maxdef = role[1];
}
return res;
}
}
基础知识
二分法
自定义排序
Java Lambda
Java 自定义排序