给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
返回该 最大总和 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/array-partition
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int arrayPairSum(int[] nums) {
Arrays.sort(nums);//首先对数组排序(升序)
int sum = 0;
for(int i = 0;i < nums.length;i++){
//每一个下标为偶数的元素都是组成min(ai, bi) 总和最大的元素之一
if(i%2 == 0){
sum = sum + nums[i];
}
}
return sum;
}
}
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/can-place-flowers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
int i = 0;//遍历数组变量
int zero = 0;//一组1和1之间0的个数
int flower = 0;//可种花数
for(;i < flowerbed.length;){
//如果有下标位置有花,下标加i
if(flowerbed[i] == 1){
i++;
}
//否则我就开始遍历零的个数,直到下一个一的出现
else {
//注意这里的限定条件,他只有头元素=0且正在遍历头元素,才会有zero++
//这是为了解决0010001这种情况的,可以明显看出001开头的只要两个零就可以插入一个,与10001不同
if(flowerbed[i] == 0 && i ==0){
++zero;
}
//开始遍历为零的元素
for(;i < flowerbed.length;i++){
//如果 元素!=0 就把当前可种花值赋给flower并且跳出
if(flowerbed[i] !=0){
// System.out.println("zer:"+zero);
if(zero % 2 ==0){
flower = flower +zero/2 -1;
}
else{
flower = flower +zero/2;
}
//跳出后,将zero值重新赋为零
zero = 0;
break;
}
++zero;
//注意这里的限定条件,他只有尾元素=0且正在遍历尾元素,才会有zero++
//这是为了解决1000100这种情况的,可以明显看出100结尾的只要两个零就可以插入一个,与10001不同
if(flowerbed[flowerbed.length - 1] == 0 && i == flowerbed.length - 1){
++zero;
//在这里记得将zero值经处理后赋值给flower,因为这种情况100结尾
//的他不会再因为if(flowerbed[i] !=0)而开始将zero经处理后赋值给flower
if(zero % 2 ==0){
flower = flower +zero/2 -1;
}
else{
flower = flower +zero/2;
}
}
}
}
}
// System.out.println("fl:"+flower);
if(flower >= n){
return true;
}
else{
return false;
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
写贪心的第六天
今天写了两道算法,不知道是变强了还是咋地,感觉挺简单的,这几天如果还是感觉到简单的话就可以开始写中等难度的算法题了。加油!