《LeetCode零基础指南》(第七讲) 贪心

1.611. 有效三角形的个数

/*给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。 */
class Solution {
    
    
    public int triangleNumber(int[] nums) {
    
    
        if(nums == null || nums.length < 3){
    
    
            return 0;
        }
        Arrays.sort(nums);//先排序
        int count = 0;
        for(int i = 0; i < nums.length; i++){
    
    
            for(int j = i + 1; j < nums.length; j++){
    
    //二分查找
                int left = j + 1, right = nums.length - 1 , temp = j;
                while(left <= right){
    
    
                    int mid = (left + right) / 2;
                    if(nums[mid] < nums[i] + nums[j]){
    
    
                        temp = mid;
                        left = mid +1;
                    }else {
    
    
                        right = mid - 1;
                    }
                }
                count += temp - j;//对存在的数直接进行temp - j得到可以的数
            }
        }
        return count;
    }
}

2.945. 使数组唯一的最小增量

/*
1.给你一个整数数组 nums,每次 move 操作将会选择任意一个满足 0 <= i < nums.length 的下标 i,并将 nums[i] 递增 1
2.返回使 nums 中的每个值都变成唯一的所需要的最少操作次数*/
class Solution {
    
    
    public int minIncrementForUnique(int[] nums) {
    
    
        Arrays.sort(nums);//排序
        int move = 0;
        for(int i = 1; i < nums.length; i++){
    
    
            //前面的大于等于后面的,直接让后面的变成前面的增量+1为最小.
            if(nums[i] <= nums[i-1]){
    
    
                move += nums[i-1] - nums[i] + 1;
                nums[i] = nums[i-1] + 1;
            }
        }
        return move;
    }
}

3.1827. 最少操作使数组递增

/*1.给你一个整数数组 nums (下标从 0 开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1 
    比方说,如果 nums = [1,2,3] ,你可以选择增加 nums[1] 得到 nums = [1,3,3] 。
2.请你返回使 nums 严格递增 的 最少 操作次数。
3.我们称数组 nums 是 严格递增的 ,当它满足对于所有的 0 <= i < nums.length - 1 都有 nums[i] < nums[i+1] 。一个长度为 1 的数组是严格递增的一种特殊情况。 */
class Solution {
    
    
    public int minOperations(int[] nums) {
    
    
        int count = 0;
        for(int i = 1; i < nums.length; i++){
    
    
            if(nums[i] <= nums[i - 1]){
    
    
                count += nums[i - 1] - nums[i] + 1;
                nums[i] = nums[i - 1] + 1;
            }
        }
        return count;
    }
}

4.455. 分发饼干

/**
1.假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
2.对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值*/
class Solution {
    
    
    public int findContentChildren(int[] g, int[] s) {
    
    
        int cookie = 0;
        int child = 0;
        Arrays.sort(g);//饼干大小排序
        Arrays.sort(s);//孩纸所需铺排序
        while(child < g.length && cookie < s.length){
    
    
            if(g[child] <= s[cookie]){
    
    
                //找出满足当前孩纸的饼干,将孩纸的数量和饼干加一
                child++;
            }
            cookie++;
        }
        return child;
    }
}

5.881. 救生艇

/*
1.第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。
2.每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
3.返回载到每一个人所需的最小船数。(保证每个人都能被船载)*/
class Solution {
    
    //贪心
    public int numRescueBoats(int[] people, int limit) {
    
    
        int count = 0;
        int light = 0;
        int heavy = people.length - 1;
        Arrays.sort(people);
        while(light <= heavy){
    
    //试比较重量不超过limmit下,可以载重的最大可能
            if(people[light] + people[heavy] <= limit){
    
    
                light++;
            }
            heavy--;//每增加一人船的可载重减少1
            count++;
        }
        return count;
    }
}

6.976. 三角形的最大周长

/*
1.给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长
2.如果不能形成任何面积不为零的三角形,返回 0*/
class Solution {
    
    
    public int largestPerimeter(int[] nums) {
    
    
        Arrays.sort(nums);//排序
        if(nums == null || nums.length < 3){
    
    
            return 0;
        }
        for(int i = nums.length - 1; i >= 2; i--){
    
    
            if(nums[i-1] + nums[i -2] > nums[i]){
    
    
                return nums[i -1] + nums[i -2] + nums[i];
            }
        }
        return 0;
    }
}

7.561. 数组拆分 I

/*
1.给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大
2.返回该最大总和 */
class Solution {
    
    
    public int arrayPairSum(int[] nums) {
    
    
        Arrays.sort(nums);
        int sum = 0;
        for(int i = 0; i < nums.length; i += 2){
    
    
            sum += nums[i];
        }
        return sum;   
    }
}

8.两个数对之间的最大乘积差

#两个数对之间的最大乘积差
class Solution:
    def maxProductDifference(self, nums: List[int]) -> int:
        n = len(nums)
        # 数组中最大的两个值
        mx1, mx2 = max(nums[0], nums[1]), min(nums[0], nums[1])
        # 数组中最小的两个值
        mn1, mn2 = min(nums[0], nums[1]), max(nums[0], nums[1])
        for i in range(2, n):
            tmp = nums[i]
            if tmp > mx1:
                mx1, mx2 = tmp, mx1
            elif tmp > mx2:
                mx2 = tmp
            if tmp < mn1:
                mn1, mn2 = tmp, mn1
            elif tmp < mn2:
                mn2 = tmp
        return (mx1 * mx2) - (mn1 * mn2)
/*
1.给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序
2.你可以假设所有输入数组都可以得到满足题目要求的结果*/
class Solution {
    
    
    public void wiggleSort(int[] nums) {
    
    
        int[] arr = nums.clone();
        Arrays.sort(arr);
        int n = nums.length;
        
        for (int i = 0; i < n / 2; i++) {
    
    
            nums[2 * i] = arr[(n - 1) / 2 - i];
            nums[2 * i + 1] = arr[n - 1 - i]; 
        }
        if (n % 2 == 1) nums[n - 1] = arr[0];
    }
}

猜你喜欢

转载自blog.csdn.net/qq_52230126/article/details/121587330
今日推荐