推荐 最新
HAO起起

Leetcode加油站问题,这个答案该怎么理解?

Leetcode加油站问题,这个答案该怎么理解? "题目地址" (https://link.segmentfault.com/?enc=d2mJ1SfcYHYKPiUGgUgePA%3D%3D.2YdtYy%2FcREJeqwiCxmn68EsZvmdfj2AWYI7uCsrsN%2Fwfv9s9R7cno4Mfoh63FZEpjLusm4QqYkA%2BHZPqXs7R2DTfvb4kipoJCw7fglifIz7WkwBlP1BDSnj9iveq456mM4c4MSZ2O0kGN%2F3O94HQcw%3D%3D) 我在官方题解的下方评论中发现了一个答案,但是对于为什么这个答案可行我并不理解。 为什么"sum >= 0"说明有解,否则就无解呢? 这个答案我有一些思路。 remainGas[i] = gas[i] - stataion[i] sum = all remainGas[i] i from 0 to n -1 * "sum >= 0" * 将相邻的remainGas[i],且它们的前缀和(这里的前缀和指的是这几个remainGas构成序列的前缀和)都大于等于0,合并成一个节点(此时这个节点代表了一段路径)。 * 这样我们就可以得到一个更小的子问题了,而且我们总是可以合并的,因为sum>=0(如果不存在的话,sum应该是=0的,从前往后合并就可以了) * "sum =0(每次合并时前缀和都是>=0的,最后一次也还是),矛盾。故不存在可行解。 为什么起点是" (minIndex + 1 )%gas.length"呢? "评论区答案" (https://link.segmentfault.com/?enc=r%2FN8jvlniz3gY4T95xawig%3D%3D.SF5rSrLJnu%2BZSbG169GnjVXcJZWg9WQENv33uYOQd4F9Q9ZLTSdSU3AA8zDp4a98niPB%2BD0nJQje%2Fx30s0%2BY%2BxyOQV6QlLdBDVVPno3AOOce%2BvvsPLk9f1z1GUbKDkUJ9PFvVg7fWt6c%2BYQlwO539H8SL88hG1pLhS716cLFaISeGN2xcG6tmQXXXg1M0RE3) class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { int sum = 0; int min = Integer.MAX_VALUE; int minIndex = -1; for(int i = 0; i & gas, vector& cost) { // 化为边上的净开销 int size = gas.size(); int i; vector edge_cost(size); for (i = 0; i < size; i++) edge_cost[i] = gas[i] - cost[i]; int cs = 0; for (i = 0; i < size; i++) { int tmp = edge_cost[i]; edge_cost[i] = cs; cs += tmp; } if (cs < 0)return-1; int p = 0; cs = 0; for (i = 0; i < size; i++) { if (edge_cost[i] < cs) { cs = edge_cost[i]; p = i; } } return p; } 这里的显然我也没有明白。

0
1
0
浏览量192
MastFancy

LeetCode 43 题字符串相乘数组初始化为什么失败呢?

LeetCode 43题字符串相乘,乘好后的结果无法放入数组,且初始化并不成功,每次想将数组初始化的时候都会报错。 尝试了用calloc,memset,for循环对数组进行初始化,但是都失败了,直接定义进行初始化也不行,不知道是什么原因? 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 我的代码: void reverseString(char* str) { int length = strlen(str); int start = 0; int end = length - 1; while (start = 0;i--) A[i] = num1[i] - '0'; for(i = len2 - 1;i >= 0;i--) B[i] = num2[i] - '0'; //int* ans = (int*)calloc((len1 + len2 + 1),sizeof(int)); int* ans = (int*)malloc(sizeof(int) * (len1 + len2)); //memset(ans, 0, sizeof(int) * (len1 + len2 + 1)); ans[0] = 0; ans[1] = 0; for(i = 0;i 0 && ans[k] != 0)//去掉最高位的0 k--; char* res = (char*)malloc(sizeof(char) * (len1 + len2)); while(k >= 0){ res[len++] = ans[k--] + '0'; //printf("ans[%d] = %d\n",k,ans[k]); } res[len] = '\0'; return res; } 可以看到我对ans的初始化进行了多次尝试,现在已经直接去定义了,ans[1] = 0,但是却报错了,这是报的错误,说是堆缓冲区溢出了: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/11a04d632b87b263b0859abc3666ba6d.png) 假如现在把ans[1] = 0,这行注释掉,会输出: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/7852de7387f791771e4752f196afcd45.png) 通过各种尝试,仍旧初始化不成功。

0
1
0
浏览量149