有序数组,找某个值,很明显的二分,先用二分找到数组中最接近x的那个元素,然后再左右扩张至长度k返回这k长度内所有的值就行。
class Solution {
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
vector<int>ans;
int p=0,q=arr.size()-1;
while(p<q){
int mid=p+(q-p)/2;
if(arr[mid]>=x){
q=mid;
}
else{
p=mid+1;
}
}
if(q!=0&&abs(arr[q-1]-x)<=abs(arr[q]-x)){
q--;
}
p=q;
while(q-p+1<k){
if(q==arr.size()-1){
p--;
}
else if(p==0){
q++;
}
else if(abs(arr[p-1]-x)<=abs(arr[q+1]-x)){
p--;
}
else{
q++;
}
}
for(p;p<=q;p++){
ans.push_back(arr[p]);
}
return ans;
}
};
思路很简单:
1)如果粉笔k数量小于每个学生消耗的数量的总和,那么遍历一遍就能出来答案。
2)如果大于,假设学生消耗的总和是sum,那么k%sum相当于轮着回答了n圈问题后剩下的粉笔,然后就和(1)一样了。
class Solution {
public:
int chalkReplacer(vector<int>& chalk, int k) {
long long sum=0;
for(int i=0;i<chalk.size();i++){
if(k-chalk[i]<0){
return i;
}
k-=chalk[i];
sum+=chalk[i];
}
k%=sum;
for(int i=0;i<chalk.size();i++){
if(k-chalk[i]<0){
return i;
}
k-=chalk[i];
}
return 0;
}
};
要是用二分做的话,或许可以试试前缀和,这样就可以将遍历数组的操作换成二分查找,会快一些。