九日打卡-6-阅读报告

练习题

1 题目描述 1913. 两个数对之间的最大乘积差

两个数对 (a, b) 和 (c, d) 之间的 乘积差 定义为 (a * b) - (c * d) 。

  • 例如,(5, 6) 和 (2, 7) 之间的乘积差是 (5 * 6) - (2 * 7) = 16 。

给你一个整数数组 nums ,选出四个 不同的 下标 wxy 和 z ,使数对 (nums[w], nums[x]) 和 (nums[y], nums[z]) 之间的 乘积差 取到 最大值 。

返回以这种方式取得的乘积差中的 最大值 。

class Solution {
public:
    int maxProductDifference(vector<int>& nums) 
    {
        int length=nums.size();
        int max=0,max_num=0;
        for(int i=0;i<length;i++)
        {
            if(nums[i]>max)
            {
                max=nums[i];
                max_num=i;
            }
        }
        nums[max_num]=0;
        int max_2=0,max_num_2=0;
        for(int i=0;i<length;i++)
        {
            if(nums[i]>max_2)
            {
                max_2=nums[i];
                max_num_2=i;
            }
        }
        nums[max_num]=max;
        int min=10000,min_num=0;
        for(int i=0;i<length;i++)
        {
            if(nums[i]<min)
            {
                min=nums[i];
                min_num=i;
            }
        }
        nums[min_num]=10000;
        int min_2=10000,min_num_2=0;
        for(int i=0;i<length;i++)
        {
            if(nums[i]<min_2)
            {
                min_2=nums[i];
                min_num_2=i;
            }
        }
        return (max*max_2-min*min_2);
    }
};

2 题目描述 976.三角形的最大周长

给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。

如果不能形成任何面积不为零的三角形,返回 0

class Solution {
public:
    int largestPerimeter(vector<int>& nums) 
    {
        int length=nums.size();
        sort(nums.begin(), nums.end(),greater<int>());
        for(int i=0;i<length-2;i++)
        {
            if(nums[i]>=(nums[i+1]+nums[i+2]))
            {
                continue;
            }
            else
            {
                return nums[i]+nums[i+1]+nums[i+2];
            }
        }
        return 0;
    }
};

3 题目描述 561.数组拆分扣I

给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。

返回该 最大总和 

class Solution {
public:
    int arrayPairSum(vector<int>& nums) 
    {
        sort(nums.begin(),nums.end());
        int sum=0;
        for(int i=0;i<nums.size();i=i+2)
        {
            sum+=nums[i];
        }
        return sum;
    }
};

4 题目描述 881.救生艇

第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。

每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。

返回载到每一个人所需的最小船数。(保证每个人都能被船载)。

class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) 
    {
        sort(people.begin(),people.end());
        int n = people.size();
        int l = 0, r = n - 1;
        int ans = 0;
        while (l <= r) {
            if (people[l] + people[r] <= limit) l++;
            r--;
            ans++;
        }
        return ans;
    }
};

5 题目描述 摆动序列II

给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。

你可以假设所有输入数组都可以得到满足题目要求的结果。

class Solution {
public:
    void wiggleSort(vector<int>& nums) 
    {
        //进行向量的赋值操作
        vector<int> temp(nums);
        int length=nums.size();
        sort(temp.begin(),temp.end());
        int sum=length-1;
        for(int i=1;i<length;i+=2)
        {
            nums[i]=temp[sum];
            sum--;
        }
        for(int i=0;i<length;i+=2)
        {
            nums[i]=temp[sum];
            sum--;
        }
        
    }
};

6 题目描述 

 

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        if (g.size()<1||s.size()<1)
        {
            return 0;
        }

        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int j=s.size()-1;
        int num=0;
        for(int i=g.size()-1;i>=0;i--)
        {
            if(j<0)
            {
                break;
            }
            else if((s[j]>=g[i])&&j>=0)
            {
                num++;
                j--;
            }
        }
        return num;

    }
};

7 题目描述

 

给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 <= i < nums.length 的下标 i,并将 nums[i] 递增 1。

返回使 nums 中的每个值都变成唯一的所需要的最少操作次数

class Solution {
public:
    int minIncrementForUnique(vector<int>& nums) 
    {
        sort(nums.begin(),nums.end());
        int length=nums.size();
        int cnt=0;
        for(int i=1;i<length;i++)
        {
            if(nums[i]<nums[i-1]+1)
            {
            cnt+=nums[i-1]+1-nums[i];
            nums[i]=nums[i-1]+1;
            }
        }
        return cnt;
    }
};

8 题目描述

给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数

class Solution {
public:
    int triangleNumber(vector<int>& nums) 
    {
        int length=nums.size();
        sort(nums.begin(),nums.end());
        int sum=0;
        for(int i=0;i<length-2;i++)
        {
            for(int j=i+1;j<length-1;j++)
            {
                int left = j + 1, right = length - 1, k = j;
                while (left <= right) 
                {
                    int mid = (left + right) / 2;
                    if (nums[mid] < nums[i] + nums[j]) {
                        k = mid;
                        left = mid + 1;
                    }
                    else {
                        right = mid - 1;
                    }
                }
                sum += k - j;
            }
        }
        return sum;
    }
};

 

心得体会

1 要善于使用双指针法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值