找到需要补充粉笔的学生编号(约瑟夫环+前缀和+二分)

x33g5p2x  于2021-09-19 转载在 其他  
字(0.7k)|赞(0)|评价(0)|浏览(420)

在这里插入图片描述

在这里插入图片描述

约瑟夫环:

时间复杂度:O(n)
空间复杂度:O(1)

  1. class Solution {
  2. public:
  3. int chalkReplacer(vector<int>& chalk, int k) {
  4. int n=chalk.size(),i=-1;
  5. long long sum=0;
  6. for(int j=0;j<n;j++)
  7. sum+=chalk[j];
  8. k%=sum;
  9. while(1){
  10. i=(i+1)%n;
  11. if(k<chalk[i]){
  12. return i;
  13. }else{
  14. k-=chalk[i];
  15. }
  16. }
  17. return 0;
  18. }
  19. };

前缀和+二分:

时间复杂度:O(n)
空间复杂度:O(1)

  1. class Solution {
  2. public:
  3. int chalkReplacer(vector<int>& chalk, int k) {
  4. int n=chalk.size();
  5. if(chalk[0]>k){
  6. return 0;
  7. }
  8. //求前缀和
  9. for(int i=1;i<n;i++){
  10. chalk[i]+=chalk[i-1];
  11. if(chalk[i]>k){
  12. return i;
  13. }
  14. }
  15. k%=chalk[n-1];
  16. //二分查找
  17. int i=0,j=n-1;
  18. while(i<=j){
  19. int mid=(i+j)/2;
  20. if(chalk[mid]>k){
  21. j=mid-1;
  22. }else if(chalk[mid]<=k){
  23. i=mid+1;
  24. }
  25. }
  26. return i;
  27. // return upper_bound(chalk.begin(), chalk.end(), k) - chalk.begin();
  28. }
  29. };

相关文章