2020-01-14 数组刷题-1
题目名称:35. 搜索插入位置
题目链接:https://leetcode-cn.com/problems/search-insert-position/
题目描述:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
来源:力扣(LeetCode)
博主开始思路以及实现:
1、进行数组遍历,并判断每一个值是否与目标值相等,如果相等,则返回该下标值
如果不等 则进行判断,与下标值比较是大还是小,选择合适位置,并进行插入操作
2、遍历使用for循环,判断相等还是不相等使用if进行判断,不相等在进行进一步的if判断,
判断比上一个位置小,比下一个位置大,并执行插入操作
错误实现1:
1 class Solution { 2 public: 3 int searchInsert(vector<int>& nums, int target) { 4 for (int i = 0; i < nums.size; i++){ 5 if (nums[i] == target){ 6 std::cout << i <<std::endl; 7 break; 8 } 9 else{ 10 if(target<nums[i-1] && target>=nums[i+1]){ 11 //插入操作 12 nums[i] = target; 13 nums.size ++; 14 break; 15 } 16 } 17 } 18 } 19 };
//错误提示
Line 4: Char 29: error: reference to non-static member function must be called;
did you mean to call it with no arguments?
for (int i=0;i<nums.size;i++){
~~~~~^~~~
()
错误实现2:
1 class Solution { 2 public: 3 int searchInsert(vector<int>& nums, int target) { 4 for(int i = 0; i < nums.size(); i++){ 5 if(nums[i] >= target){ 6 return i; 7 } 8 else{ 9 return nums.size(); 10 } 11 } 12 } 13 };
参考&问题讲解:
https://mp.weixin.qq.com/s/fCf5QbPDtE6SSlZ1yh_q8Q
最终实现代码:
1 class Solution { 2 public: 3 int searchInsert(vector<int>& nums, int target) { 4 for(int i = 0; i<nums.size(); i++){ 5 if(nums[i] >= target){ 6 return i; 7 } 8 } 9 return nums.size(); 10 } 11 };
存在问题:
1、审题出现错误,不需要进行插入具体操作,只需要返回插入位置即可
2、对待c++语言的使用存在很大问题(博主还未从头到尾学习C++语言)ps:<QVector>;cin cout;
3、针对二分查找的学习(二分查找的边界问题&循环不变量)
二分查找代码:
1 class Solution { 2 public: 3 int searchInsert(vector<int>& nums, int target) { 4 //二分查找的写法 5 int n = nums.size(); 6 int left = 0; 7 int right = n-1; 8 while(left <= right){ 9 int middle = left +((right - left)/2); 10 if(target < nums[middle] ){ 11 right = middle-1; 12 }else if(target > nums[middle]){ 13 left = middle+1; 14 }else{//nums[middle] = target 15 return middle; 16 } 17 } 18 return right + 1; 19 } 20 };