俩方法都是用二分查找,一个调库,一个自己写而已。
方法一,调库
1 static int wing=[]() 2 { 3 std::ios::sync_with_stdio(false); 4 cin.tie(NULL); 5 return 0; 6 }(); 7 8 class Solution 9 { 10 public: 11 char nextGreatestLetter(vector<char>& letters, char target) 12 { 13 auto p=upper_bound(letters.begin(),letters.end(),target); 14 return p==letters.end()? letters[0]:*p; 15 } 16 };
方法二,自己写二分
1 static int wing=[]() 2 { 3 std::ios::sync_with_stdio(false); 4 cin.tie(NULL); 5 return 0; 6 }(); 7 8 class Solution 9 { 10 public: 11 char nextGreatestLetter(vector<char>& letters, char target) 12 { 13 int sz=letters.size(); 14 int left=0,right=sz-1; 15 if(target>=letters[right]) 16 return letters[0]; 17 while(left<=right) 18 { 19 int mid=left+((right-left)>>1); 20 if(letters[mid]<target) 21 left=mid+1; 22 else if(letters[mid]>target) 23 right=mid-1; 24 else 25 left=mid+1; 26 } 27 return letters[left]; 28 } 29 };
自己写的时候要注意,在判定时,当letters[mid]==target的时候,不能直接就返回letters[mid+1],因为字符数组中有可能存在一大串和目标字符相等的元素,所以有可能返回到相等的元素之一。