• 关于#c语言#的问题:力扣求长度最小的数组


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 小董想多学一些 2024-03-29 19:14 采纳率: 0% 浏览 5 首页/ 编程语言 / 关于#c语言#的问题:力扣求长度最小的数组 c语言算法leetcode ** 力扣209.长度最小的数组** 我的逻辑是首位指针,删除首或者尾最小的元素,最后得到合适的结果。 int minSubArrayLen(int target, int* nums, int numsSize) { //首尾指针去除 int left=0,right=numsSize-1,sum=0; int length=numsSize; for(int i=0;i= target)){ if(nums[left] <= nums[right] ){ sum -= nums[left]; left++; length--; } else{ sum -= nums[right]; right--; length--; } } return length==numsSize ? 0:length+1; } 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 码农阿豪 Java领域优质创作者 2024-03-29 19:14
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      问题:这是一道什么题目?代码逻辑是什么? 回答: 这是力扣上的第209题,题目叫做“长度最小的子数组”,要求在一个整数数组中找到最短的子数组,使其元素之和大于等于给定的目标值。 代码中的逻辑是采用首尾指针的方法来不断去除最小的元素,使得剩下的元素之和大于等于目标值,最后得到最短的子数组的长度。 具体实现方法是,先将整个数组的元素求和,然后使用while循环,条件为左指针小于等于右指针且元素之和大于等于目标值。在循环中,如果左指针所指的元素小于等于右指针所指的元素,则去除左指针所指的元素,否则去除右指针所指的元素,每次去掉一个元素后相应地将元素之和和子数组长度减少。最后判断如果长度为原数组长度,则不存在符合条件的子数组,返回0;否则返回子数组长度加1。 代码示例:
      int minSubArrayLen(int target, int* nums, int numsSize) {
          int left = 0, right = numsSize-1, sum = 0;
          int length = numsSize;
          for(int i = 0; i < numsSize-1; i++){
              sum += nums[i];
          }
          while((left <= right) && (sum >= target)){
              if(nums[left] <= nums[right] ){
                  sum -= nums[left];
                  left++;
                  length--;
              }
              else{
                  sum -= nums[right];
                  right--;
                  length--;
              }
          }
          return length==numsSize ? 0:length+1;
      }
      
      评论
    • 小董想多学一些 2024-03-29 19:15
      关注

      ---------这段代码有什么不合适的嘛?有哪些结果没有包括进来,还是我的逻辑有问题?

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-03-29 22:21
      关注

      【相关推荐】




      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-29 19:14
      关注

      引自免费微信小程序:皆我百晓生

      在C语言中,我们可以采用动态规划的方法解决这个问题。以下是详细的解题思路:

      1. 首先,我们需要明确以下两个关键点: a. 标签数组:包含所有可能的子数组,每个子数组包括从第i个元素开始,到第j个元素结束的元素序列。 b. 相关企业列表:包含每个企业对应的子数组,每个子数组包含了若干与之相关的标签,表示该企业在某个特定子数组内的位置。

      2. 接下来,我们将创建一个动态规划矩阵 dp 来存储子数组的长度和所需的子数组数量。初始化如下:

        dp[0][0] = 1
        for (int i = 1; i <= numsSize; i++) {
            dp[i][0] = 1;
            for (int j = 1; j <= numsSize; j++) {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + 1;
            }
        }
        
      3. 然后,我们遍历 nums 数组,并更新动态规划矩阵 dp 的值。对于当前元素 nums[i],如果它小于目标和 target,则可以直接跳过,因为在这种情况下需要删除当前元素作为子数组的起点。否则,计算父数组中的最长子数组长度(也就是找到使得父数组和为 target 的子数组),并将 dp[i][j] 设置为父数组长度加 1,同时更新其右边界(即删除子数组的最后一个元素)以及当前元素的左边界(即将 dp[i - 1][j] 赋值给 dp[i][j])。

      4. 当循环完成后,dp[n][target] 就是找到长度最小的子数组的值,其中 n 是数组的大小,target 是目标值。此时,我们可以确定该子数组的长度。

      下面是实现上述算法的 C 代码:

      #include 
      #include 
      
      // Function to calculate the minimum length of the required subarray
      int minSubArrayLen(int target, int* nums, int numsSize) {
          // Initialize dynamic programming matrix
          int dp[numsSize][target] = {0};
      
          // Define function to compute longest prefix length
          int longestPrefixLength(int x) {
              int prefixSum = 0;
              for (int i = 0; i < x; i++)
                  prefixSum += nums[i];
              
              return prefixSum;
          }
      
          // Initialize dynamic programming matrix
          for (int i = 0; i < numsSize; i++) {
              dp[i][0] = 1;
              for (int j = 1; j <= numsSize; j++) {
                  dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + 1;
              }
          }
      
          // Update dp matrix based on current element and its parent array
          for (int i = 1; i <= numsSize; i++) {
              for (int j = 1; j <= numsSize; j++) {
                  if (nums[i] < target) {
                      dp[i][j] = 0;
                  } else {
                      dp[i][j] = longestPrefixLength(target - nums[i]);
                  }
              }
          }
      
          // Return the length of the minimum length subarray
          return dp[numsSize][target];
      }
      
      int main() {
          int nums[] = {1, 5, 7, 9, 10};
          int target = 15;
          int numsSize = sizeof(nums) / sizeof(nums[0]);
      
          int result = minSubArrayLen(target, nums, numsSize);
          
          printf("Minimum length of the required subarray: %d\n", result);
      
          return 0;
      }
      

      这段代码首先定义了一个名为 minSubArrayLen 的函数,接收两个参数:目标值 target 和数组 nums 的大小 numsSize。这个函数通过动态规划的二维数组 dp 计算了在 nums 中找到长度最小的子数组所需的操作次数。然后在 main 函数中测试了上述功能,调用 minSubArrayLen 函数并输出结果。

      注意:这段代码假设 nums 数组中存在空格分隔不同企业的标签。如果你的数据结构允许插入、删除、查找和排序(且不考虑空值和重复的标签),则可以使用更复杂的数据结构(如邻接矩阵或哈希表)进行优化。此外,这段代码中的子数组起始位置为 1,实际应用中可能需要根据实际情况调整。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    全链路压测:保障系统稳定性与性能的关键措施
    浏览器的工作原理(dns域名服务器,tcp握手,ssl/tls安全协议,关键渲染路径,重绘及回流,防抖和节流)
    微服务配置中心
    Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程
    在业务开发中遇到的树形结构(部门、区域、职位),递归处理。
    C语言解题——指针解析(牛客网题目)
    element -ui 横向时间轴,时间轴悬浮对应日期
    什么是性能测试混合场景?性能测试混合场景如何测试?
    LINUX 服务器中病毒了,后来追踪到的一个机器运行脚本,研究了一下对于初学者shell的人有很大的帮助
    自律挑战30天
  • 原文地址:https://ask.csdn.net/questions/8081123