给你一个整数数组 nums ,选出四个 不同的 下标 w、x、y 和 z ,使数对 (nums[w], nums[x]) 和 (nums[y], nums[z]) 之间的 乘积差 取到 最大值 。
返回以这种方式取得的乘积差中的 最大值 。
题目连接:两个数对之间的最大乘积差
代码展示:
class Solution {
public int maxProductDifference(int[] nums) {
Arrays.sort(nums);
int n=nums.length;
return nums[n-1]*nums[n-2]-nums[0]*nums[1];//最大的相乘减去最小的相乘
}
}
🌰**贪心考虑:**要获得一个最大的差值,那我们肯定想着需要用一个最大的值减去一个最小的值。那如何从获得一个乘积最大和一个乘积最小的值呢?那肯定是最大的数乘第二大的数的和最小的数乘以第二小的数。所以我们直接排序后,用最大的两个数相乘减去最小的两个数相乘就是答案啦。
🍈2.三角形的最大周长(易)
给定由一些正数(代表长度)组成的数组
A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。
如果不能形成任何面积不为零的三角形,返回
0。
题目链接:三角形的最大周长
代码展示:
class Solution {
public int largestPerimeter(int[] nums) {
Arrays.sort(nums); //先排序
int n=nums.length;
for(int i=n-1;i>=2;i–){ //倒叙遍历(从最大的开始判断)
int x=nums[i-1]+nums[i-2]; //判断后两条边是否能满足围成三角形
if(x>nums[i]){
return x+nums[i];
}
}
return 0;
}
}
🌰**贪心考虑:**又是一道题目中包含最大字眼的例题。先思考如何让三角形周长最大?那肯定三条边越长越好呀。我们可以直接将三条边捆绑着来看,比如有一个排序好的数组[1,2,2,3,4,7],你肯定先判断3,4,7能否围成三角形,发现不能,那你觉得7这条边还能用上吗?肯定不能了,因为除了7最长的3和4加起来都构不成三角形,其他更加不可能。所以我再考虑2,3,4三条边,这次发现可以了,所以2,3,4就是能围成最大三角形的三条边。
🍈3.数组拆分|(易)
给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
返回该 最大总和 。
题目链接:数组拆分|
代码展示:
class Solution {
public int arrayPairSum(int[] nums) {
Arrays.sort(nums); //同样先将数组从小到大排序
int n=nums.length;
int count=0;
for(int i=0;i<n;i+=2){ //只取偶数位相加即为答案
count+=nums[i];
}
return count;
}
}
🌰**贪心考虑:**题目要求将数组两两配对,每一对只取更小的那个数,另外一个将会被浪费掉。假设有个排好序的数组(a1,a2,a3…an),a1作为最小的数,那么和它匹配的数,肯定要被浪费掉,那我们肯定希望被浪费的数越小越好,那除了a1最小的就是a2了呀,所以a1和a2匹配。这样同理又从a3开始匹配,a3把a4带走浪费掉,所以最后我们取得的数下标都是从0开始的偶数位,所以将索引为偶数位相加就是最大的值了。
🍈4.救生艇(中)
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回载到每一个人所需的最小船数。(保证每个人都能被船载)。
题目链接:救生艇
class Solution {
public int numRescueBoats(int[] people, int limit) {
int ans = 0;
Arrays.sort(people);//让人从轻到重排好序站好
int light = 0;
int heavy = people.length - 1;//利用双指针
while (light <= heavy) {
if (people[light] + people[heavy] <= limit) {//判断此时最轻的和最重的能否坐一起
++light; //可以的话左指针右移(说明最轻的跟着最重的一起走了)
}
–heavy; //右指针左移,无论能不能带一个最轻的,这个重的都得走
++ans;
}
return ans;
}
}
🌰**贪心考虑:**首先我们要明白,人肯定是全都要带走的,它也不可能有一个人的体重直接超过船的承受重量的,这样的话题目就出错了。为了减少船的次数,我们无非只能希望在带最重的人的同时再带走一个人,带谁呢?那最有可能的当然是场上最轻的人,如果这个最重的人和最轻的人加一起都超重,那这个最重的人自己注定只能自己走了。然后再继续重复判断剩下里面的人最重的能否和最轻的走,直到所有人走完。所以我们可以通过双指针来分别指向场上最轻的和最重的来进行选人。
🍈5.分发饼干(小剧场解答)
🌰贪心考虑:同样是求最值问题,这道理和上一题有异曲同工之妙。我们的目标是为了满足更多的孩子,那当然是优先满足容易吃饱的孩子,所以我们需要将孩子排好序。对于饼干呢?我们当然更想先把尺寸较小的饼干给孩子们吃掉,而不是一上来就把大饼干拿出来,所以我们同样要给饼干也排序。综合两种贪心的思想:我们就想要尽可能用尺寸最小的饼干去喂饱最容易吃饱的孩子。既然如此就会出现两种情况:1.最小的饼干能喂饱最容易吃饱的孩子,这种情况我们是我们希望见到的。2.最小的饼干满足不了最容易吃饱的孩子,那你这块饼干说明就没用了,你连最容易喂饱的都喂不饱,那还有什么用,那只能考虑尺寸更大一定的饼干。综上考虑,我们同样得用双指针,分别指向此时最容易吃饱的孩子和尺寸最小的饼干。
代码展示:
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int n1=g.length;//孩子的个数
int n2=s.length;//饼干的个数
int l=0;//指向最容易吃饱的孩子的指针
int r=0;//指向尺寸最小的饼干的指针
int count=0;
while(l<n1&&r<n2){ //如果孩子喂完了或者饼干吃完都会结束
if(s[r]>=g[l]){ //如果最小的饼干能满足最容易吃饱的孩子
r++; //孩子指针右移
l++; //饼干指针右移
count++;
}else{ //如果满足不了最小的孩子
r++; //舍弃当前饼干,饼干指针右移再次继续判断
}
}
return count;
}
}
🍈6. 最少操作使数组递增(易)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。






既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)

总结
其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。
这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来
目录:

部分内容截图:


总结
其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。
这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来
目录:
[外链图片转存中…(img-lqvoCkap-1711893509564)]
部分内容截图:
[外链图片转存中…(img-BhXa0vw4-1711893509564)]
[外链图片转存中…(img-rVwisSB6-1711893509565)]

1702

被折叠的 条评论
为什么被折叠?



