给一个正整数n和一个长度为n的整数序列,计算出每个元素距离该整数序列0的的最短距离

想利用的二分法解决问题,但是数列中的0不止一个,不知道如果找到最优的分发和解法

  1. 排序:对给定的整数序列进行排序,确保0元素位于序列的合适位置。

  2. 计算最短距离:遍历排序后的整数序列,对于每个非零元素,使用二分法在序列中查找最近的0的位置。二分法可以帮助我们在有序序列中更快地找到目标元素。
    如果找到了0,将最短距离设为0。
    如果没有找到0,找到最接近0的两个元素,计算它们到0的距离,并将最短距离设为较小的值。

3.返回结果:得到每个元素距离最近的0的最短距离后,将结果返回。

仅供参考


#include <iostream>
#include <vector>
#include <algorithm>

int binarySearch(const std::vector<int>& nums, int target) {
    int left = 0;
    int right = nums.size() - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return right;
}

std::vector<int> calculateShortestDistances(const std::vector<int>& nums) {
    std::vector<int> sortedNums = nums;
    std::sort(sortedNums.begin(), sortedNums.end());
    std::vector<int> distances;

    for (int num : nums) {
        if (num == 0) {
            distances.push_back(0);
        } else {
            int index = binarySearch(sortedNums, 0);
            if (index < 0) {
                int distance = std::min(std::abs(sortedNums[index]), std::abs(sortedNums[index + 1]));
                distances.push_back(distance);
            } else {
                int distance = std::abs(sortedNums[index]);
                distances.push_back(distance);
            }
        }
    }

    return distances;
}

int main() {
    int n = 5;
    std::vector<int> nums = {3, -2, 0, 4, -1};
    std::vector<int> distances = calculateShortestDistances(nums);

    std::cout << "Shortest distances: ";
    for (int distance : distances) {
        std::cout << distance << " ";
    }
    std::cout << std::endl;

    return 0;
}

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/2046499
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:通过一趟遍历找出长度为n的单链表中值最大的节点.【数据结构】【单链表】
  • 除此之外, 这篇博客: 斐波那契数列应用中的 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 分析:根据斐波那契数列定义可以使用递归  Fibonacci(int n)=Fibonacci(int n-1)+Fibonacci(int n-2)

    Fibonacci(0)==0

    Fibonacci(1)==1

    • 以下回答由chatgpt基于相关博客总结生成:

      首先,我们需要定义一个函数来计算每个元素与整数序列中的0之间的最短距离。该函数可以使用二分法来查找0的位置,并计算元素与0之间的距离。

      def shortest_distance(nums):
          start = 0  # 起始位置
          end = len(nums) - 1  # 结束位置
      
          while start <= end:
              mid = (start + end) // 2  # 中间位置
              if nums[mid] == 0:
                  return 0  # 如果当前元素为0,则最短距离为0
              elif nums[mid] < 0:
                  start = mid + 1  # 如果当前元素小于0,则0在后半部分
              else:
                  end = mid - 1  # 否则,0在前半部分
      
          # 当前位置为最接近0的元素的位置
          if start == 0:
              return nums[start]  # 如果当前位置为0,则最短距离为0
          elif start == len(nums):
              return nums[end]  # 如果当前位置超出数组范围,则最短距离为最后一个元素
          else:
              return min(abs(nums[start]), abs(nums[end]))  # 返回最短距离
      

      然后,我们需要读取输入的整数序列并调用上述函数来计算每个元素与0之间的最短距离。我们可以使用一个循环来读取输入,并将输入存储在一个列表中。然后,对于列表中的每个元素,我们调用shortest_distance函数来计算最短距离,并将结果存储在另一个列表中。

      # 读取整数序列
      n = int(input("请输入整数序列的长度:"))
      nums = []
      for i in range(n):
          nums.append(int(input("请输入第{}个元素:".format(i+1))))
      
      # 计算每个元素与0之间的最短距离
      distances = []
      for num in nums:
          distance = shortest_distance(nums)
          distances.append(distance)
      
      # 打印最短距离列表
      print("每个元素与0之间的最短距离:", distances)
      

      请注意,上述代码是使用Python编写的。如果使用其他编程语言,您需要相应地修改代码。