feat(redo): 添加LeetCode问题134、135、860、1005的解决方案新增四个Java类,分别对应LeetCode问题134、135、860、1005的解决方案。
这些问题涉及循环数组、糖果分配、零钱兑换和数组操作等不同主题。 每个类包含一个或多个解决特定问题的算法实现,以及相关的测试方法。 - LeetCode134:实现计算加油站问题的解决方案。 - LeetCode135:实现计算糖果分配问题的解决方案。 - LeetCode860:实现柠檬水找零问题的解决方案。 - LeetCode1005:实现数组操作以最大化和的解决方案。 接下来的步骤包括将这些解决方案集成到主项目中,并通过单元测试确保其正确性。
This commit is contained in:
parent
536890ab62
commit
967dc09bec
108
src/main/java/cn/whaifree/redo/redo_all_240721/LeetCode1005.java
Normal file
108
src/main/java/cn/whaifree/redo/redo_all_240721/LeetCode1005.java
Normal file
@ -0,0 +1,108 @@
|
||||
package cn.whaifree.redo.redo_all_240721;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/8/5 23:37
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode1005 {
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
int[] nums = new int[]{-8,3,-5,-3,-5,-2};
|
||||
Solution solution = new Solution();
|
||||
System.out.println(solution.largestSumAfterKNegations(nums, 6));
|
||||
|
||||
}
|
||||
class Solution {
|
||||
/**
|
||||
* -4 3 2 1
|
||||
* // 如果绝对值最大的是负数-1
|
||||
* // 把所有负数变为正
|
||||
* // 如果k还有
|
||||
* // 偶数,不改了
|
||||
* // 奇数,找到最小的变为负数
|
||||
* @param nums
|
||||
* @param k
|
||||
* @return
|
||||
*/
|
||||
public int largestSumAfterKNegations(int[] nums, int k) {
|
||||
|
||||
PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
|
||||
@Override
|
||||
public int compare(Integer o1, Integer o2) {
|
||||
int absCompare = Math.abs(o2) - Math.abs(o1);
|
||||
if (absCompare != 0) {
|
||||
return absCompare;
|
||||
} else {
|
||||
// 如果绝对值相同,负数排在正数前面
|
||||
return o1 - o2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
for (int num : nums) {
|
||||
queue.add(num);
|
||||
}
|
||||
|
||||
List<Integer> list = new ArrayList<>();
|
||||
for (int i = 0; i < nums.length; i++) {
|
||||
list.add(queue.poll());
|
||||
}
|
||||
|
||||
int sum = 0;
|
||||
for (int i = 0 ; i < list.size() ; i++) {
|
||||
Integer poll = list.get(i);
|
||||
if (poll < 0 && k > 0) {
|
||||
sum += -poll;
|
||||
k--;
|
||||
}else {
|
||||
sum += poll;
|
||||
}
|
||||
}
|
||||
if (k % 2 == 0) {
|
||||
return sum;
|
||||
}else {
|
||||
Integer poll = Math.abs(list.get(list.size() - 1));
|
||||
return sum - poll - poll;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class Solution1 {
|
||||
/**
|
||||
* -4 -7 3 2 1
|
||||
* -7 -4 1 2 3
|
||||
*
|
||||
* @param nums
|
||||
* @param k
|
||||
* @return
|
||||
*/
|
||||
public int largestSumAfterKNegations(int[] nums, int k) {
|
||||
Arrays.sort(nums);
|
||||
int res = 0;
|
||||
int minAbs = Integer.MAX_VALUE;
|
||||
for (int i = 0; i < nums.length; i++) {
|
||||
if (nums[i] < 0 && k > 0) {
|
||||
nums[i] = -nums[i];
|
||||
k--;
|
||||
}
|
||||
minAbs = Math.min(minAbs, nums[i]); // 已经全部翻转
|
||||
res += nums[i];
|
||||
}
|
||||
|
||||
if (k % 2 == 0) {
|
||||
return res;
|
||||
}else {
|
||||
return res - 2 * minAbs;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package cn.whaifree.redo.redo_all_240721;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/8/5 23:08
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode134 {
|
||||
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
int[] gas = {1,2,3,4,5};
|
||||
int[] cost = {3,4,5,1,2};
|
||||
System.out.println(new Solution().canCompleteCircuit(gas, cost));
|
||||
}
|
||||
|
||||
class Solution {
|
||||
public int canCompleteCircuit(int[] gas, int[] cost) {
|
||||
|
||||
// 理论上,如果汽油够,一定能绕圈
|
||||
int sumGas = Arrays.stream(gas).parallel().sum();
|
||||
int sumCost = Arrays.stream(cost).parallel().sum();
|
||||
if (sumGas < sumCost) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int nowHave = 0;
|
||||
int nowStart = 0;
|
||||
for (int i = 0; i < gas.length; i++) {
|
||||
nowHave += gas[i];
|
||||
if (nowHave < cost[i]) {
|
||||
nowHave = 0;
|
||||
nowStart = (i + 1) % gas.length;
|
||||
} else {
|
||||
nowHave -= cost[i];
|
||||
}
|
||||
}
|
||||
return nowStart;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package cn.whaifree.redo.redo_all_240721;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/8/6 22:56
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode135 {
|
||||
|
||||
@Test
|
||||
public void test()
|
||||
{
|
||||
System.out.println(new Solution().candy(new int[]{1,2,2,3,1}));
|
||||
}
|
||||
class Solution {
|
||||
public int candy(int[] ratings) {
|
||||
|
||||
int[] candy = new int[ratings.length];
|
||||
Arrays.fill(candy, 1);
|
||||
for (int i = 0; i < ratings.length - 1; i++) {
|
||||
if (ratings[i] < ratings[i + 1]) {
|
||||
candy[i + 1] = candy[i] + 1;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = ratings.length - 1; i > 0; i--) {
|
||||
if (ratings[i - 1] > ratings[i]) {
|
||||
candy[i - 1] = Math.max(candy[i - 1], candy[i] + 1);
|
||||
// candy[i-1]为原来从左到右遍历的值,需要记录保存
|
||||
}
|
||||
}
|
||||
return Arrays.stream(candy).sum();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package cn.whaifree.redo.redo_all_240721;
|
||||
|
||||
/**
|
||||
* @version 1.0
|
||||
* @Author whai文海
|
||||
* @Date 2024/8/6 22:51
|
||||
* @注释
|
||||
*/
|
||||
public class LeetCode860 {
|
||||
|
||||
class Solution {
|
||||
public boolean lemonadeChange(int[] bills) {
|
||||
int iHave5 = 0;
|
||||
int iHave10 = 0;
|
||||
for (int bill : bills) {
|
||||
if (bill == 5) {
|
||||
iHave5++;
|
||||
} else if (bill == 10) {
|
||||
iHave5--;
|
||||
iHave10++;
|
||||
} else if (bill == 20) {
|
||||
|
||||
if (iHave10 > 0) {
|
||||
iHave10--;
|
||||
iHave5--;
|
||||
}else {
|
||||
iHave5 -= 3;
|
||||
}
|
||||
|
||||
}
|
||||
if (iHave5 < 0 || iHave10 < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user