查看: 1882| 回复: 17
跳转到指定楼层
上一主题 下一主题
收起左侧

[数组] 请教一道经典题

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
请教大家一道经典题。
sorted array after rotation. return the starting index for the minimum element.
[1,1,1,1,1,1] -> 0
[1,1,1,2,1,1] -> 4
谢谢各位大佬。

上一篇:lintcode vip
下一篇:为什么有的公司会白票OA呢?
推荐
twtypsj 2021-3-24 03:54:35 | 只看该作者
全局:
Andrew007 发表于 2021-3-24 03:43
非常感谢大神的解答和耐心。🐂

谢谢你给了这么多test case,开始是真没想到。只是第一感觉应该用BS,具体还是有很多要注意的点啊。

评分

参与人数 1大米 +1 收起 理由
blackrose + 1 赞一个

查看全部评分

回复

使用道具 举报

推荐
twtypsj 2021-3-24 03:30:49 | 只看该作者
全局:
本帖最后由 twtypsj 于 2021-3-24 03:41 编辑
Andrew007 发表于 2021-3-24 02:51
这个能过不?[2,1,1,1,2]目前我想的case有
    cout

大意了,没考虑这么多case



  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int findMin(vector<int> nums) {
  5.     if(nums.front() < nums.back()) return 0;
  6.     int left = 0, right = nums.size() - 1;
  7.     int front = nums[0];
  8.    
  9.     while(left < right-1 && nums[left] >= nums[right])
  10.     {
  11.         if(nums[left]==nums[left+1])
  12.             left++;
  13.         else if(nums[right]==nums[right-1])
  14.             right--;
  15.         else
  16.         {
  17.             int mid = left + (right - left) / 2;
  18.             if(nums[mid] > nums[right]) left = mid;
  19.             else if(nums[mid] < nums[left]) right = mid;
  20.             else left++,right--;
  21.         }
  22.     }
  23.     if(left==right-1&&nums[left]==front&&nums[right]==front)return 0;
  24.     return nums[left]<nums[right]?right+1:right;
  25. }
  26. int main()
  27. {
  28.     cout << findMin({1,2,3,6,1}) << endl;
  29.     cout << findMin({1,1,1,2,1,1}) << endl;
  30.     cout << findMin({1,2,1,1,1}) << endl;
  31.     cout << findMin({1,1,1,1,1}) << endl;
  32.     cout << findMin({2,2,1,1,2,2}) << endl;
  33.     cout << findMin({2,2,3,3,2,2}) << endl;
  34.     return 0;
  35. }




复制代码


这会的输出是,应该是对的
4                                                                                                                                      
4                                                                                                                                      
2                                                                                                                                      
0                                                                                                                                      
2                                                                                                                                      
4                                                                                                                                      
                                                                                                                                       
                                                                                                                                       
...Program finished with exit code 0                                                                                                   
Press ENTER to exit console.   

评分

参与人数 2大米 +4 收起 理由
blackrose + 1 赞一个
Andrew007 + 3 非常感谢大神的解答和耐心。🐂

查看全部评分

回复

使用道具 举报

推荐
twtypsj 2021-3-24 02:35:46 | 只看该作者
全局:
本帖最后由 twtypsj 于 2021-3-24 02:44 编辑
Andrew007 发表于 2021-3-24 02:14
非常感谢。还有一些小bug,但是已经很好了。 比如 [1,2,1,1,1], [1,1,1,1,1]. 继续加米。

刚测了一下【1,2,1,1,1】这个的输出是2,这个应该是正确的吧
【1,1,1,1,1】确实没考虑
改了一下,这种情况下,最坏情况会变成O(n)时间,平均是O(lg(n))



  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. int findMin(vector<int> nums) {
  6.     if(nums.front() < nums.back()) return 0;
  7.     int left = 0;
  8.     int right = nums.size()-1;
  9.     while(left<right&&nums[left]==nums[right]){left++;right--;}
  10.     if(left == right) return 0;
  11.     while(left < right-1 && nums[left] >= nums[right])
  12.     {
  13.         int mid = left + (right - left) / 2;
  14.         if(nums[mid] > nums[right]) left = mid;
  15.         else if(nums[mid] < nums[left]) right = mid;
  16.         else left++,right--;
  17.     }
  18.     return nums[left]<nums[right]?right+1:right;

  19. }
  20. int main()
  21. {
  22.     cout << findMin({1,2,3,6,1}) << endl;
  23.     cout << findMin({1,1,1,2,1,1}) << endl;
  24.     cout << findMin({1,2,1,1,1}) << endl;
  25.     cout << findMin({1,1,1,1,1}) << endl;
  26.     return 0;
  27. }
复制代码


目前这个的输出是 4 4 2 0, 应该是正确的吧?

评分

参与人数 2大米 +3 收起 理由
blackrose + 1 赞一个
Andrew007 + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
二分法求最后一个最大值,然后输出他的后一位?
回复

使用道具 举报

🔗
 楼主| Andrew007 2021-3-23 04:45:58 | 只看该作者
全局:
tigerwash 发表于 2021-3-23 04:40
二分法求最后一个最大值,然后输出他的后一位?

这可以用来求 [2,1,1,1,2]吗?
回复

使用道具 举报

全局:
经典题难道不应该看经典解答吗
你是看不懂还是懒得查?

补充内容 (2021-3-23 05:48):
我记得是一开始把21112前后的2去掉一个之后二分。
回复

使用道具 举报

全局:
可以重复的我记得没法二分,只能暴力On
回复

使用道具 举报

全局:
LC 154咯
回复

使用道具 举报

🔗
twtypsj 2021-3-23 10:37:38 | 只看该作者
全局:
用BS吧?
  1.   
  2. int findMin(vector<int>& nums) {
  3.         int left = 0;
  4.         int right = nums.size()-1;
  5.         while(left < right-1 && nums[left] >= nums[right])
  6.         {
  7.             int mid = left + (right - left) / 2;
  8.             if(nums[mid] > nums[right]) left = mid;
  9.             else if(nums[mid] < nums[left]) right = mid;
  10.             else left++,right--;
  11.         }
  12.         return nums[left]<nums[right]?left:right;
  13.     }
复制代码

评分

参与人数 2大米 +2 收起 理由
Andrew007 + 1 给你点个赞!
blackrose + 1 赞一个

查看全部评分

回复

使用道具 举报

🔗
 楼主| Andrew007 2021-3-24 00:54:18 | 只看该作者
全局:
twtypsj 发表于 2021-3-23 10:37
用BS吧?
[mw_shl_code=cpp,true]  
int findMin(vector& nums) {

运行了一下,结果好像不对。[1,1,1,2,1,1] 返回了2.
回复

使用道具 举报

🔗
 楼主| Andrew007 2021-3-24 00:54:55 | 只看该作者
全局:

不是原题。 这个是找index。
回复

使用道具 举报

🔗
 楼主| Andrew007 2021-3-24 00:56:04 | 只看该作者
全局:
一剑终情 发表于 2021-3-23 07:21
可以重复的我记得没法二分,只能暴力On

可能。当时面试的时候,面试官让我在二分的基础上改。当时没写出来,不是找最左就是最右。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表