missed coommit the source files

This commit is contained in:
Hao Chen 2019-01-29 15:44:58 +08:00
parent d30f995193
commit 0e29ac77de
2 changed files with 176 additions and 0 deletions

View File

@ -0,0 +1,99 @@
// Source : https://leetcode.com/problems/minimum-cost-for-tickets/
// Author : Hao Chen
// Date : 2019-01-29
/*****************************************************************************************************
*
* In a country popular for train travel, you have planned some train travelling one year in advance.
* The days of the year that you will travel is given as an array days. Each day is an integer from 1
* to 365.
*
* Train tickets are sold in 3 different ways:
*
* a 1-day pass is sold for costs[0] dollars;
* a 7-day pass is sold for costs[1] dollars;
* a 30-day pass is sold for costs[2] dollars.
*
* The passes allow that many days of consecutive travel. For example, if we get a 7-day pass on day
* 2, then we can travel for 7 days: day 2, 3, 4, 5, 6, 7, and 8.
*
* Return the minimum number of dollars you need to travel every day in the given list of days.
*
* Example 1:
*
* Input: days = [1,4,6,7,8,20], costs = [2,7,15]
* Output: 11
* Explanation:
* For example, here is one way to buy passes that lets you travel your travel plan:
* On day 1, you bought a 1-day pass for costs[0] = $2, which covered day 1.
* On day 3, you bought a 7-day pass for costs[1] = $7, which covered days 3, 4, ..., 9.
* On day 20, you bought a 1-day pass for costs[0] = $2, which covered day 20.
* In total you spent $11 and covered all the days of your travel.
*
* Example 2:
*
* Input: days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15]
* Output: 17
* Explanation:
* For example, here is one way to buy passes that lets you travel your travel plan:
* On day 1, you bought a 30-day pass for costs[2] = $15 which covered days 1, 2, ..., 30.
* On day 31, you bought a 1-day pass for costs[0] = $2 which covered day 31.
* In total you spent $17 and covered all the days of your travel.
*
* Note:
*
* 1 <= days.length <= 365
* 1 <= days[i] <= 365
* days is in strictly increasing order.
* costs.length == 3
* 1 <= costs[i] <= 1000
*
******************************************************************************************************/
class Solution {
private:
int min(int x, int y){
return x < y ? x : y;
}
int min(int x, int y, int z) {
return min(min(x, y), z);
}
public:
int mincostTickets(vector<int>& days, vector<int>& costs) {
// Dynamic Programming
vector<int> dp(days.size(), INT_MAX);
// dp[i] is the minimal cost from Days[0] to Days[i]
dp[0] = costs[0];
for (int i = 1; i< days.size(); i ++) {
// the currnet day need at least 1-day pass cost
int OneDayPass = dp[i-1] + costs[0];
// Seprating the array to two parts.
// days[0] -> days[j] -> day[i]
//
// calculate the day[i] - day[j] whether can use 7-day pass or 30-day pass
//
// Traking the minimal costs, then can have dp[i] minimal cost
int SevenDayPass = INT_MAX, ThrityDayPass = INT_MAX;
for (int j=i-1; j>=0; j--){
if (days[i] - days[j] < 7 ) {
SevenDayPass = dp[j-1] + costs[1];
} else if (days[i] - days[j] < 30 ) {
ThrityDayPass = dp[j-1] + costs[2];
} else {
break;
}
int m = min(OneDayPass, SevenDayPass, ThrityDayPass);
if ( dp[i] > m ) dp[i] = m;
}
}
return dp[dp.size()-1];
}
};

View File

@ -0,0 +1,77 @@
// Source : https://leetcode.com/problems/string-without-aaa-or-bbb/
// Author : Hao Chen
// Date : 2019-01-29
/*****************************************************************************************************
*
* Given two integers A and B, return any string S such that:
*
* S has length A + B and contains exactly A 'a' letters, and exactly B 'b' letters;
* The substring 'aaa' does not occur in S;
* The substring 'bbb' does not occur in S.
*
* Example 1:
*
* Input: A = 1, B = 2
* Output: "abb"
* Explanation: "abb", "bab" and "bba" are all correct answers.
*
* Example 2:
*
* Input: A = 4, B = 1
* Output: "aabaa"
*
* Note:
*
* 0 <= A <= 100
* 0 <= B <= 100
* It is guaranteed such an S exists for the given A and B.
******************************************************************************************************/
class Solution {
public:
string strWithout3a3b(int A, int B) {
string result;
while (true){
// if A == B, then just simpley repeat "ab" pattern;
if (A == B) {
for ( int i=0; i<A; i++ ) {
result += "ab";
}
break;
}
// if A+B less then 3 and A != B, which means A=1,2 && B=0 or A=0 && B=1,2
if (A+B <3) {
while ( A-- > 0 ) result += 'a';
while ( B-- > 0 ) result += 'b';
break;
}
// if A+B >=3 and A !=B
// if A > B, then we need consume 'a' more than 'b'
// So, only "aab" can be used.
if ( A > B ) {
result += "aab";
A -= 2;
B--;
continue;
}
// if A > B, then we need consume 'b' more than 'a'
// So, only "bba" can be used.
if (B > A ){
result += "bba";
B-=2;
A--;
continue;
}
}
return result;
}
};