一、 問題描述
?二、算法思想???
? ? ? ?該問題可以通過二分查找的思想來解決。
? ? ? ?首先,我們可以使用二分查找找到目標值在數組中的任意一個位置(即該位置的值等于目標值)。假設找到的位置為mid。
? ? ? ?接下來,我們需要在mid的左邊和右邊分別找到目標值的開始位置和結束位置。
在mid的左邊查找目標值的開始位置: 我們可以繼續使用二分查找,在數組的左半部分中查找目標值的開始位置。具體思路如下:
- 初始化start為0,end為mid。
- 如果nums[mid]等于target,則將end更新為mid-1,繼續在左半部分查找。
- 如果nums[mid]大于target,則將end更新為mid-1,繼續在左半部分查找。
- 如果nums[mid]小于target,則將start更新為mid+1,繼續在左半部分查找。 直到start大于end時,我們找到了目標值在數組中的開始位置。
? ? ? ? 在mid的右邊查找目標值的結束位置: 我們可以繼續使用二分查找,在數組的右半部分中查找目標值的結束位置。具體思路如下:
- 初始化start為mid,end為數組長度-1。
- 如果nums[mid]等于target,則將start更新為mid+1,繼續在右半部分查找。
- 如果nums[mid]大于target,則將end更新為mid-1,繼續在右半部分查找。
- 如果nums[mid]小于target,則將start更新為mid+1,繼續在右半部分查找。 直到start大于end時,我們找到了目標值在數組中的結束位置。
? ? ? ?最后,如果數組中不存在目標值target,則開始位置和結束位置都為0。
三、代碼實現??
#include<stdio.h>
int result[2];
void search(int *nums,int n,int target)
{result[0]=0;result[1]=0;int left=0,mid;int right=n-1;while(left<=right){mid=left+(right-left)/2;if(nums[mid]>target){right=mid-1;}else if(nums[mid]<target){left=mid+1;}else{result[0]=mid+1;right=mid-1;}}left=0;right=n-1;while(left<=right){int mid=left+(right-left)/2;if(nums[mid]>target){right=mid-1;}else if (nums[mid]<target){left=mid+1;}else{result[1]=mid+1;left=mid+1;}}
}int main(){int target,nums[100];int n,i;scanf("%d",&n);scanf("%d",&target);for(i=0;i<n;i++){scanf("%d",&nums[i]);}search(nums,n,target);printf("%-3d",result[0]);printf("%-3d",result[1]);return 0;}
執行結果??
?結語???
你要安靜的優秀
還有悄無聲息的堅強
!!!