题解 | #分糖果问题#
刷题记录
代码 2.0 仍然是错误的 QAQ
public class Solution {
/**
* pick candy
* @param arr int整型一维数组 the array
* @return int整型
*/
public int candy (int[] nums) {
int sum=0;
int candy[]=new int[arr.length];
candy[0]=1;
for (int i = 0; i < arr.length-1; i++) {
if (arr[i]<arr[i+1]){
candy[i+1]=candy[i]+1;
}
if (arr[i]==arr[i+1]){
candy[i+1]=candy[i];
}
if (arr[i]>arr[i+1]){
if (candy[i]==1){//关键!!!!
candy[i+1]=1;
candy[i]=candy[i]+1;
for (int j = i; j >0 ; j--) {
if (arr[i-1]==arr[i]){
candy[i-1]=candy[i];
}
if (arr[i-1]>arr[i]&&
(candy[i-1]<candy[i]||candy[i-1]==candy[i])){
candy[i-1]=candy[i]+1;
}
if (arr[i-1]<arr[i]){
break;
}
}
}
if (candy[i]>1){
candy[i+1]=1;
}
}
}
//测试输出
for (int i = 0; i < candy.length; i++) {
// System.out.print("****");
//System.out.print(candy[i]);
sum=sum+candy[i];
}
return sum;
}
}
代码3.0 仍然错误
public class Solution {
/**
* pick candy
* @param arr int整型一维数组 the array
* @return int整型
*/
public int candy (int[] arr) {
// write code here
int sum=0;
int candy[]=new int[arr.length];
//candy[0]=1;
for (int i = 0; i < arr.length-1; i++) {//首 从左到右 上坡
//candy[i]=1;
if (arr[i]<arr[i+1]){
if (candy[i]==0){
candy[i]=1;
}
candy[i+1]=candy[i]+1;
}
if (arr[i]==arr[i+1]){
if (candy[i]==0){
candy[i]=1;
}
candy[i+1]=candy[i];
}
if(arr[i]>arr[i+1]){
candy[i+1]=1;
continue;
}
}//尾
for (int i = arr.length-1; i >0; i--) {//首 从右到左 上坡
if (arr[i]==arr[i-1]){
candy[i-1]=candy[i];
}
if (arr[i]>arr[i-1]){
continue;
}
if (arr[i]<arr[i-1]){
if (candy[i-1]==1||candy[i-1]==0){
candy[i-1]=candy[i]+1;
}
}
}//尾巴
for (int i = 0; i < candy.length; i++) {
sum=sum+candy[i];
}
return sum;
}
}
代码 4.0 运行出错
1、我不知道哪里出了问题 输入一个超长数组 (将系统测试数组arr截断)运行结果与预期是相等的,但是输入系统的测试数组(arr)时 运行结果与预期不一样。我在想,是不是数组长度的问题。 2、在编译器idea上输入统测试数组(arr),系统不会有任何结果 终端只会显示“代码过长”
public class Solution {
/**
* pick candy
* @param arr int整型一维数组 the array
* @return int整型
*/
public int candy (int[] arr) {
// write code here
int sum=0;
int candy[]=new int[arr.length];
int a=0;
int b=0;
for (int i = 0; i < candy.length; i++) {
candy[i]=1;
}
for (int i = 0; i < arr.length-1; i++) {//首 从左到右 上坡
//candy[i]=1;
if (arr[i]<arr[i+1]){
candy[i+1]=candy[i]+1;
}
if (arr[i]==arr[i+1]){
candy[i+1]=candy[i];
}
if(arr[i]>arr[i+1]){
continue;
}
}//尾
for (int i = arr.length-1; i >0; i--) {//首 从右到左 上坡
if (arr[i]==arr[i-1]){
candy[i-1]=candy[i];
}
if (arr[i]>arr[i-1]){
continue;
}
if (arr[i]<arr[i-1]){
a=candy[i-1];
b=candy[i]+1;
candy[i-1]=Math.max(a,b);
}
}//尾巴
for (int i = 0; i < candy.length; i++) {
sum=sum+candy[i];
}
return sum;
}
}
## 代码4.0错误原因
## ```曲解题目 上面的代码运算结果比预期大的原因是:相邻分数相同时,我设置糖果数也相同即分数为[1,2,2,2]对应糖果数[1,2,2,2],而题目的意思是:分数为[1,2,2,2]对应糖果数[1,2,1,1]
## 代码5.0 正确!!!
``` import java.util.*;
public class Solution {
/**
* pick candy
* @param arr int整型一维数组 the array
* @return int整型
*/
public int candy (int[] arr) {
// write code here
int sum=0;
int candy[]=new int[arr.length];
int a=0;
int b=0;
for (int i = 0; i < candy.length; i++) {
candy[i]=1;
}
for (int i = 0; i < arr.length-1; i++) {//首 从左到右 上坡
//candy[i]=1;
if (arr[i]<arr[i+1]){
candy[i+1]=candy[i]+1;
}
if (arr[i]==arr[i+1]){//关键点2
candy[i+1]=1;
}
if(arr[i]>arr[i+1]){
continue;
}
}//尾
for (int i = arr.length-1; i >0; i--) {//首 从右到左 上坡
if (arr[i]==arr[i-1]){
// candy[i-1]=candy[i];
}
if (arr[i]>arr[i-1]){
continue;
}
if (arr[i]<arr[i-1]){
a=candy[i-1];
b=candy[i]+1;
candy[i-1]=Math.max(a,b);
}
}//尾巴
for (int i = 0; i < candy.length; i++) {
sum=sum+candy[i];
}
return sum;
}
}