经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
Leetcode No.35 Search Insert Position(c++实现)
来源:cnblogs  作者:云梦士  时间:2021/6/28 9:42:23  对本文有异议

1. 题目

1.1 英文题目

Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You must write an algorithm with O(log n) runtime complexity.

1.2 中文题目

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

1.3输入输出

输入 输出
nums = [1,3,5,6], target = 5 2
nums = [1,3,5,6], target = 2 1
nums = [1,3,5,6], target = 7 4
nums = [1,3,5,6], target = 0 0
nums = [1], target = 0 0

1.4 约束条件

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums contains distinct values sorted in ascending order.
  • -104 <= target <= 104

2. 实验平台

IDE:VS2019
IDE版本:16.10.1
语言:c++11

3. 程序

3.1 测试程序

  1. #include "Solution.h"
  2. #include <vector> // std::vector
  3. #include<iostream> // std::cout
  4. using namespace std;
  5. // 主程序
  6. void main()
  7. {
  8. // // 输入
  9. vector<int> nums = { 1,3,5,6 };
  10. int val = 4;
  11. Solution solution; // 实例化Solution
  12. int k = solution.searchInsert(nums, val); // 主功能
  13. // 输出
  14. cout << k << endl;
  15. }

3.2 功能程序

3.2.1 最佳程序

(1)代码

  1. #pragma once
  2. #include<vector> // std::vector
  3. using namespace std;
  4. //主功能(二分法+递归)
  5. class Solution
  6. {
  7. public:
  8. int searchInsert(vector<int>& nums, int target)
  9. {
  10. int low = 0, high = nums.size()-1;
  11. while(low<=high)
  12. {
  13. int mid = low + (high - low)/2;
  14. if(target == nums[mid])
  15. return mid;
  16. else if(target>nums[mid])
  17. low = mid+1;
  18. else
  19. high = mid-1;
  20. }
  21. return low;
  22. }
  23. };

此程序参考:https://blog.csdn.net/lym940928/article/details/79893316

(2)解读

使用的是二分查找法,当while循环完成时,说明没有找到对应的数字,此时low > high,即low = high+1。因为数字树位于[low, hight+1]中的,也即位于[low,low]之中,因此返回low,即为target的最后的位置。

3.2.2 自写程序

(1)代码

  1. #pragma once
  2. #include<vector> // std::vector
  3. using namespace std;
  4. //主功能(二分法+递归)
  5. class Solution
  6. {
  7. public:
  8. int searchInsert(vector<int>& nums, int target)
  9. {
  10. if (target <= nums[0]) return 0; // 如果目标值比数组第一个元素还小,则返回0
  11. else
  12. return func(nums, target, 0, nums.size()); // 运行主要函数
  13. }
  14. int func(vector<int>& nums, int target, int left, int right)
  15. {
  16. int min = 0;
  17. if (right - left <= 1) return right;
  18. else
  19. {
  20. int mid = (left + right) / 2;
  21. if (nums[mid] > target)
  22. {
  23. right = mid;
  24. return func(nums, target, left, right); // 递归
  25. }
  26. else if (nums[mid] < target)
  27. {
  28. left = mid;
  29. return func(nums, target, left, right);
  30. }
  31. else
  32. return mid;
  33. }
  34. }
  35. };

(2)思路

由约束条件一可知数组不为空数组,由约束条件三知数组里的元素是按照升序排列的,也就是说不用考虑降序排列的情况。另外由题目中要求时间复杂度为O(log n),可以联想到是用二分法进行求解,二分法的过程中还用到了递归的思想。

4. 相关知识

(1) 报错:error: non-void function does not return a value in all control paths

这个错误在VS2019中没有报,但是在Leetcode那里却报错了,当时挺蒙蔽的,后来查找资料才知道,原来是自己我if...else if...else if...else...里前几个没有return,也就是说有些情况没有返回值,考虑不周全。
这个可以参考:https://blog.csdn.net/pikaqiu123321123/article/details/114580378

原文链接:http://www.cnblogs.com/yunmeng-shi/p/14932430.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号