您的位置:首页 > 其它

31. Next Permutation \ 33. Search in Rotated Sorted Array

2017-01-21 11:03 281 查看
next permutation
算法思想

实现

Search in Rotated Sorted Array

31. next permutation

算法思想

对当前排列从后向前扫描,找到一对为升序的相邻元素,记为i和j(i < j)。如果不存在这样一对为升序的相邻元素,则所有排列均已找到,算法结束;否则,重新对当前排列从后向前扫描,找到第一个大于i的元素k,交换i和k,然后对从j开始到结束的子序列反转,则此时得到的新排列就为下一个字典序排列。这种方式实现得到的所有排列是按字典序有序的,这也是C++ STL算法next_permutation的思想。

实现

class Solution {
public:
void nextPermutation(vector<int>& nums) {
int nums_len = nums.size() - 1;

int ind, stop_point = -1;
for(ind = nums_len; ind > 0; ind--) {
if(nums[ind-1] < nums[ind]) {
stop_point = ind;
break;
}
}

if(ind >= 1) {
int bigger_num = nums_len;
while(nums[bigger_num] <= nums[ind-1]) {
bigger_num--;
}
int tmp = nums[bigger_num];
nums[bigger_num] = nums[ind-1];
nums[ind-1] = tmp;
reverse(nums.begin() + ind, nums.end());
}
else {
reverse(nums.begin(),  nums.end());
}

}
};


33. Search in Rotated Sorted Array

首先是O(n)的做法,这个当然是比较差的。

class Solution {
public:
int search(vector<int>& nums, int target) {
int nums_len = nums.size() - 1;

for(int i = 0; i <= nums_len; i++) {
if(nums[i] == target)
return i;
}

return -1;
}
};


然后是O(logN):这个的速度还不如上面那个,估计是用了假的测试集(测试集比较短)

class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();

int lo=0, hi=n-1;
// find the index of the smallest value using binary search.
// Loop will terminate since mid < hi, and lo or hi will shrink by at least 1.
// Proof by contradiction that mid < hi: if mid==hi, then lo==hi and loop would have been terminated.
while(lo < hi){
int mid=(lo+hi)/2;
if(nums[mid] > nums[hi])  lo=mid+1;
else hi=mid;
}

// lo==hi is the index of the smallest value and also the number of places rotated.
int rot=lo;
lo=0;hi=n-1;

// The usual binary search and accounting for rotation.
while(lo<=hi){
int mid=(lo+hi)/2;
int realmid=(mid+rot)%n;
if(nums[realmid]==target) return realmid;
if(nums[realmid]<target) lo=mid+1;
else hi=mid-1;
}
return -1;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息