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];
}
}