0
点赞
收藏
分享

微信扫一扫

Java 第 09 课 ★540. 有序数组中的单一元素 1996. 游戏中弱角色的数量

攻城狮Chova 2022-02-25 阅读 28

第九课 ★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 自定义排序

举报

相关推荐

0 条评论