二分搜索(2)
2017-10-26 20:25
246 查看
一、定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]< arr[1],那么arr[0]是局部最小;如果arr[N-1]< arr[N-2],那么arr[N-1]是局部最小;如果0< i< N-1,既有arr[i]< arr[i-1]又有arr[i]< arr[i+1],那么arr[i]是局部最小。 给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可。
二、对于一个有序数组arr,再给定一个整数num,请在arr中找到num这个数出现的最左边的位置。
给定一个数组arr及它的大小n,同时给定num。请返回所求位置。若该元素在数组中未出现,请返回-1。
测试样例:
[1,2,3,3,4],5,3
返回:2
三、对于一个有序循环数组arr,返回arr中的最小值。有序循环数组是指,有序数组左边任意长度的部分放到右边去,右边的部分拿到左边来。比如数组[1,2,3,3,4],是有序循环数组,[4,1,2,3,3]也是。
给定数组arr及它的大小n,请返回最小值。
测试样例:
[4,1,2,3,3],5
返回:1
class Solution { public: int getLessIndex(vector<int> arr) { size_t n = arr.size(); if(n <= 0) return -1; else if(n == 1) return 0; else if(arr[0] < arr[1]) return 0; else if(arr[n-1] < arr[n-2]) return n-1; int res = get_LessIndex(arr,1,n-2); return res; } int get_LessIndex(vector<int> arr,int left,int right) { while(left <= right) { int mid = left + (right-left)/2; if(arr[mid] < arr[mid-1] && arr[mid] < arr[mid+1]) { return mid; } else if(arr[mid] > arr[mid-1]) { right = mid - 1; } else if(arr[mid] > arr[mid+1]) { left = mid + 1; } } return -1; } };
二、对于一个有序数组arr,再给定一个整数num,请在arr中找到num这个数出现的最左边的位置。
给定一个数组arr及它的大小n,同时给定num。请返回所求位置。若该元素在数组中未出现,请返回-1。
测试样例:
[1,2,3,3,4],5,3
返回:2
//最左的位置,即等于num的第一个数 class LeftMostAppearance { public: int findPos(vector<int> arr, int n, int num) { int res=-1; int left=0,right=n-1; int mid=0; while(left<=right){ mid=left+(right-left)/2; if(arr[mid]==num){ res=mid; right=mid-1; } else if(arr[mid]>num) right=mid-1; else left=mid+1; } return res; } };
三、对于一个有序循环数组arr,返回arr中的最小值。有序循环数组是指,有序数组左边任意长度的部分放到右边去,右边的部分拿到左边来。比如数组[1,2,3,3,4],是有序循环数组,[4,1,2,3,3]也是。
给定数组arr及它的大小n,请返回最小值。
测试样例:
[4,1,2,3,3],5
返回:1
class MinValue { public: int getMin(vector<int> arr, int n) { if (n == 0) return -1; int left = 0; int right = n - 1; while (left < right) { if (arr[left] < arr[right]) //说明仍然有序,left为最小值 { return arr[left]; } if (left == right-1) { break; } int mid = left + (right - left) / 2; if (arr[left] > arr[mid]) //最小值在left和mid之间 { right = mid; continue; } if (arr[right] < arr[mid]) //最小值在mid和right之间 { left = mid; continue; } while (left < mid) { if (arr[left] == arr[mid]) { left++; } else if (arr[left] < arr[mid]) { return arr[left]; } else { right = mid; break; } } } if (arr[left] < arr[right]) return arr[left]; else return arr[right]; } };
相关文章推荐
- [2010山东ACM省赛] Greatest Number(数的组合+二分搜索)
- Professor GukiZ and Two Arrays CodeForces - 620D (暴力枚举+二分搜索)
- 关于二分搜索中间点的一点感想
- CSU-ACM2017暑假集训2-二分搜索 A - Can you find it?
- Can you solve this equation?--CSU-ACM2017暑假集训2-二分搜索
- 二分搜索的运用(1最大化最小值)
- [LeetCode] Search a 2D Matrix 二分搜索
- HDU - 2141:Can you find it?(二分搜索)
- 蓝桥模拟题 还款计算(二分搜索)
- poj 1759 Garland (二分搜索之其他)
- 笨办法学 Python · 续 练习 21:二分搜索
- 二分搜索典型应用(一)从有序数组中查找某个值
- POJ 3111 - K Best(二分搜索)
- 二分搜索poj106
- poj 3621(参数搜索+二分+spfa负环求解)
- POJ - 3258/USACO - Dec06 Silver/NOIP 2015 - 提高组 River Hopscotch 贪心+二分搜索
- POJ - 1064 Cable master(二分搜索)
- zoj 1101 二分搜索
- 二分搜索专题2-在有序二维数组中搜索一个元素
- [挑战程序设计]二分搜索