Given a sorted array 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 may assume no duplicates in the array.

Here are few examples.
[1,3,5,6], 5 → 2
[1,3,5,6], 2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6], 0 → 0

首先是自己一个比较蠢的方法,可能当时没怎么细细的想,大体的思路就是,将vector中元素存放到set中(因为set插入的时候已经排好序了),首先查找,找不到的话在插入,并且记下插入位置,指针递增到那个地方的时候就找到了那个位置。如果第一次找到那个位置的就直接递增找到那个位置即可,代码见下,很不优雅:

 class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
set<int>tmpSet(nums.begin(), nums.end());//因为set已经排好序了,所以用set
int i = ;
set<int>::iterator sItor;
if((sItor = (tmpSet.find(target))) == tmpSet.end())//不在set中的话,就先插入
sItor = tmpSet.insert(target);
for(auto itor = tmpSet.begin(); itor != it.first; ++itor){
i++;
return i;
}
};

但是其实在网上找了点好的答案,实际上这个就是二分法的一个小小的变形而已:

 class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int beg = ;
int end = nums.size() - ;
int mid;
while(beg <= end){
mid = (beg + end) >> ;
if(nums[mid] > target)
end = mid - ;
else if(nums[mid] < target)
beg = mid + ;
else
return mid;
}
int sz = nums.size();
if(end < ) reutrn ; //这个地方应该注意,不要搞反了
if(beg >= sz) reutrn sz;
return beg; //这一步应该注意,很关键
}
};

二分法不可小觑,细节还是很多的,仔细看看都能有不小的收获。其实实际上感觉写出来不太容易错的还是上面写的那种方法,不过那个总杆觉写出来怪怪的,不合题目的初衷了都。

java代码如下所示:

 public class Solution {
public int searchInsert(int[] nums, int target) {
int beg = 0;
int end = nums.length - 1;
while(beg <= end){
int mid = beg + (end - beg)/2;
if(nums[mid] > target)
end--;
else if(nums[mid] < target)
beg++;
else
return mid;
}
if(beg >= nums.length)
return nums.length;
if(end < 0)
return 0;
return beg;
}
}

最新文章

  1. [LeetCode] Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数
  2. C++网络套接字编程TCP和UDP实例
  3. is_null, empty, isset, unset对比
  4. 增强for循环
  5. scala基础语法(变量,数据类型,函数)
  6. 收集的55个Linux系统管理中常用的一些shell命令
  7. 笔直的水管 usaco 背包
  8. BT5之Metasploit[MSF]连接postgresql数据库
  9. Linux线程属性总结
  10. Mozilla研究—深入理解mozilla所需的背景知识
  11. 使用ntfs的磁盘映射功能
  12. 【git 问题小说说】 git add时候报错:LF will be replaced by CRLF
  13. [生成树][Uva1395][Slim Span]
  14. Clojure学习:表达式与函数
  15. 实现透明渐变的Activity
  16. Touch Handling in Cocos2D 3.x(三)
  17. web.xml文件介绍
  18. office 2016密钥
  19. vi三种模式的切换
  20. phpexcel一个bug

热门文章

  1. keras中 LSTM 的 [samples, time_steps, features] 最终解释
  2. SQL基础二
  3. NUnit TestFixtureSetup 和 TestFixtureTearDown
  4. 详解HTTP中GET与POST的区别,不是你看过的标准答案!
  5. ijkplayer实现IMediaDataSource
  6. Python3.x:pip install pymssql安装时出错
  7. React Native集成Redux框架讲解与应用
  8. resultMap结果集映射
  9. ErrorHandling in asp.net web api
  10. Merge-Sort(归并排序)