leetcode二期

标准

语言
地址
思路
注释写好

代码done

15

// c with stl(c++)
// 15
// https://leetcode-cn.com/problems/3sum/
// 先排序,然后找,符合的就加入答案
class Solution {
public:

    vector<vector<int>> threeSum(vector<int>& nums) {
    	vector<vector<int>> res;
    	int NUM = nums.size();
    	if(NUM < 3)
    		return res;

    	sort(nums.begin(), nums.end());
    	int i,j,k, need, a, before=-111111;

    	for(i=0; i <NUM -2; i++){
    		need = -nums[i];
            if(before == -need)
                continue;
            else
                before = -need;
    		j = i+1;
    		k = NUM-1;

    		while(j<k){
    			if(nums[j]+nums[k] > need){
    				a = nums[k];
    				while(nums[k] ==a && k>j)
    					k--;
    			}
    			else if(nums[j]+nums[k] < need){
    				a = nums[j];
    				while(nums[j] ==a && j<k)
    					j++;
    			}
    			else{
    				vector<int> temp{nums[i],nums[j],nums[k]};
    				res.push_back(temp);
                    a = nums[k];
    				while(nums[k] ==a && k>j)
    					k--;
                    a = nums[j];
    				while(nums[j] ==a && k>j)
    					j++;
    			}
    		}
    	}
    	return res;
    }
};

81

// c with stl(c++)
// 81
// https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/
// 先分为两段,分别找,找到返回

class Solution {
public:
    bool bisearch(vector<int>& nums,int low,int high, int aim){
        int mid;
        while(low <= high){
            mid = (low +high)/2;
            if(nums[mid]== aim)
                return true;
            else if(nums[mid] > aim)
                high = mid -1;
            else if(nums[mid] < aim){
                low = mid +1;
            }
        }
        return false;
    }
    bool search(vector<int>& nums, int target) {
        int start=0;
        int size = nums.size();
        while((start<size-1)    &&  (nums[start] <= nums[start+1]))
            start++;
        return bisearch(nums, 0,start, target)||bisearch(nums, start+1,size-1, target);
    }
};

35

// c with stl(c++)
// 35
// https://leetcode-cn.com/problems/search-insert-position/


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

33

// c with stl(c++)
// 33
// https://leetcode-cn.com/problems/search-in-rotated-sorted-array/

class Solution {
public:
    int bisearch(vector<int>& nums, int low, int high, int target) {
        int mid;
        while(high >= low){
            mid = (low +high) /2;
            if( nums[mid] == target)
                return mid;
            else if( nums[mid] <target)
                low = mid+1;
            else
                high = mid-1;
        }
        return -1;
    }

    int inside(vector<int>& nums,int left, int right, int target){
        if(left>right)
            return -1;
        int mid = (left + right)/2;
        if(target == nums[mid])
            return mid;
        if((target > nums[mid]) && (nums[right] >=target))
            return bisearch(nums, mid+1, right, target);
        if( (target >= nums[left]) && (target < nums[mid]) )
            return bisearch(nums, left, mid -1, target);
        if( nums[mid] < nums[left])
            return inside( nums, left,mid-1, target);
        else
            return inside( nums, mid +1 , right, target);
    }
    
    int search(vector<int>& nums, int target) {
        return inside(nums, 0, nums.size()-1, target);
    }
};

153

// c with stl(c++)
// 153
// https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/

class Solution {
public:
    int inside(vector<int>& nums, int left, int right){
        if(nums[left] <=nums[right])
            return nums[left];
        int mid = (left +right)/2;
        if( nums[left] <= nums[mid]){
            return inside(nums, mid+1, right);
        }else{
            return inside(nums, left, mid);
        }
    }

    
    int findMin(vector<int>& nums) {
        return inside(nums, 0, nums.size() -1);
    }
};

70

// c with stl(c++)
// 70
// https://leetcode-cn.com/problems/climbing-stairs/
// 用一个数组存1到n阶的方法,然后动态规划?也可以用递归,但是递归比较慢比较耗内存
class Solution {
public:
    int climbStairs(int n) {
        int dp[n+1];
        dp[0] = 1;
        dp[1] = 1;
        for(int i =2; i <=n; i++){
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
};

154

// c with stl(c++)
// 154
// https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/
// 二分,递归

class Solution {
public:

	int inside(vector<int>& nums, int left, int right){
        // cout<< "IN";
        // cout<< '(';
        // cout<< left ;
        // cout<< '-';
        // cout<< right ;
        // cout<< ')';
		int val_l = nums[left] ;
		int val_r = nums[right] ;
		if( left+1 >= right)
			return (val_l > val_r)? val_r: val_l ;
		int mid = (left +right)/2 ;
		int val_m = nums[mid] ;

		if(val_l < val_r)
			return val_l;

		if(val_l < val_m)
			return inside( nums, mid, right);

		if(val_m < val_r)
			return inside( nums, left, mid);

		// cout << "flat";

    	// int i = left ;
    	// while((i< right-1) && (nums[i] <= nums[i+1])){
    	// 	i++;
    	// }
     //    // cout << i;
     //    if( i == right ){
     //        i = left-1;
     //    }
    	// return nums[i+1];

    	int min_l = inside(nums, left, mid);
    	int min_r = inside(nums, mid, right);
    	return (min_r < min_l)? min_r: min_l;
	}


    int findMin(vector<int>& nums) {
    	return inside(nums, 0, nums.size()-1);
    }
};

263

// c with stl(c++)
// 263
// https://leetcode-cn.com/problems/ugly-number/
// 分别去掉 n 中的质因数2,3,5,然后判断


class Solution {
public:
    bool isUgly(int n) {
        if((n == -2147483648)||(n==0))
            return false;

        while(n%2 ==0)
            n /=2;

        while(n%3 ==0)
            n /=3;

        while(n%5 ==0)
            n /=5;

        if(n==1)
            return true;

        return false;
    }
};

56

// c with stl(c++)
// 56
// https://leetcode-cn.com/problems/merge-intervals/
// 先排序,然后合并


class Solution {
public:
    bool judge(vector<int>& i1, vector<int>& i2){
        if(i1[1] >= i2[0])
            return true;
        return false;
    }


    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int size = intervals.size();

        sort(intervals.begin(), intervals.end());
        // for(int i = 0; i <size; i++){
        //     cout<< intervals[i][0];
        //     cout<< ',';
        //     cout<< intervals[i][1] << endl;
        // }

        vector< vector<int>> res;
        for(int i = 0; i< size; ){
            int j = i+1;
            int max = intervals[i][1];
            while((j < size) && ( intervals[j][0] <= max)){
                (max<intervals[j][1])?(max = intervals[j][1]):1;
                j++;
            }
            res.push_back({intervals[i][0], max});
            i = j;
        }
       
        return res;
    }
};

264

// c with stl(c++)
// 264
// https://leetcode-cn.com/problems/ugly-number-ii/
// 3指针


class Solution {
public:
    int nthUglyNumber(int n) {
        int dp[n+1];
        if(n <=3)
            return n;
        dp[1] = 1;
        int i=1, j =1, k =1;
        int count =2;

        while(count<= n ){
            int min= dp[i]*2;
            if(dp[j]*3 <= min)
                min =dp[j]*3;
            if(dp[k]*5 <= min)
                min =dp[k]*5;
            dp[count] = min;
            while(dp[i]*2 <= min)
                i++;
            while(dp[j]*3 <= min)
                j++;
            while(dp[k]*5 <= min)
                k++;
            count++;
        }
        return dp[n];
    }
};

539

// c with stl(c++)
// 539
// https://leetcode-cn.com/problems/minimum-time-difference/
// 先排序,然后合并
#include <algorithm>

class Solution {
public:
    int getnum(string what){
        string min(what,0,2);
        string sec(what,3,2);
        // cout<< min<<'#'<<sec;
        return stoi(min)*60 +stoi(sec);
    }
    int findMinDifference(vector<string>& timePoints) {
        int size = timePoints.size();
        if(size >1440 )
            return 0;
        vector<int> res;
        int temp;
        for(int i = 0; i<size; i++){
            temp = getnum( timePoints.back());
            timePoints.pop_back();
            res.push_back(temp);
        }
        sort(res.begin(), res.end());
        int last = res[size-1];

        for(int i = 1; i< size; i++){
            res[size - i] = res[size - i] -res[size - i-1];
        }
        res[0] = res[0]+ 1440 -last;
        sort(res.begin(), res.end());
        return res[0];
    }
};

now

没done

日志

本文写于2021年3月11日,后续会不断更新,目前是用c++(带stl的c)来做题。

4.8 写了5道,主要是二分法的题目

4.9 写了两题

4.10 写了一题

4.11 write 2

原文地址:https://www.cnblogs.com/gallien/p/14516335.html