leecode[三]

153. 寻找旋转排序数组中的最小值

leecode[三]
思路一:
比较暴力的求解,找到翻转的点(由升序变为降序),有找到这个点,则就是下一个点就是。没有找到这个点,就是第一个点。

class Solution {
public:
    int findMin(vector<int>& nums) {
        int size = nums.size();
        int i,tmp;
        if(size==1){
            return nums[0];    
        }
        
        for(i=1,tmp=nums[0];i<size;i++){
            if(nums[i]<tmp){
                break;
            }
            tmp=nums[i];
        }
        if(i!=size){
            return nums[i];
        }else{
            return nums[0];
        }
        
    }
};

思路二:
我们需要知道,对于一个区间A,如果A[start] < A[stop],那么该区间一定是有 序的了。
另外,由于不含重复元素,需要分两种情况。
对于一个轮转了的排序了的数组,
如果nums[mid]>nums[left],最小值一定在右半区间
如果nums[mid]<nums[left],最小值一定在左半区间

class Solution {
public:
    int findMin(vector<int>& nums) {
        for (int low = 0, high = nums.size() - 1; low <= high;){
            if (nums[low] <= nums[high]){
                return nums[low];
            }
            int mid = low + (high - low) / 2;
            if (nums[mid] > nums[high]){
                low = mid + 1;
            } else {//[3,1,2]
                high = mid;
            }
        }
        return INT_MIN;
    }
};

static const auto __lamda = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();

238. 除自身以外数组的乘积

leecode[三]
正序成一次,逆序乘一次,每次的时间复杂度都是O(n)
即:
0 1 1x2 1x2x3
4x3x2, 4x3, 4, 0

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        vector<int> shun;
        int size=nums.size();
        int tmp=1;
        shun.push_back(1);
        for(int i=1;i<size;i++){
             shun.push_back(shun[i-1]*nums[i-1]);
        }
        
        for(int j=1;j<size;j++){
            tmp=tmp*nums[size-j];
            shun[size-j-1]*=tmp;
        }
        
        return shun;
    }
};

102. 二叉树的层次遍历

leecode[三]