• 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

  • 相关阅读:
    使用QTM 博客客户端
    sdut 2080 最长公共子序列问题
    sdut 1730 数字三角形问题
    HDOJ 1905 Pseudoprime numbers(模运算)
    HDU 1285确定比赛名次(拓补排序)
    HDU 2094产生冠军(map)
    HDOJ 1228 A+B(map水题)
    HDOJ 1713 相遇周期 (最大公约数与最小公倍数)
    HDOJ 2098 分拆素数和(筛选法求素数)
    (转)最大子序列和问题
  • 原文地址:https://www.cnblogs.com/gallien/p/14516335.html
Copyright © 2020-2023  润新知