---
# System prepended metadata

title: Greedy
tags: [Greedy, Week_1]

---

###### tags: `Week_1`, `Greedy`

# Greedy

## [121. Best Time to Buy and Sell Stock](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/)

harry
```ruby=
# @param {Integer[]} prices
# @return {Integer}
def max_profit(prices)
  # profit at nth day = price[N] - 看前面幾天可以買到的最便宜價格
  # profit = 
  #  { n > 1, m: max(price[n] - min_cost_til_now, 0))
  #  { n == 1: -1
  profit = 0
  min_cost_til_now = 10001
  prices.each_with_index do |price, i|
    if price < min_cost_til_now
      min_cost_til_now = price
    elsif price - min_cost_til_now > profit
      profit = price - min_cost_til_now
    end
  end
  profit
end
```

beny
```csharp=
public class Solution {
    public int MaxProfit(int[] prices) {
        int maxProfit = 0;
        int minbuy = prices[0];    
        for(int i = 0; i < prices.Length; i++){                    
            if(minbuy > prices[i]){
                minbuy = prices[i];
            }
            if(prices[i] - minbuy > maxProfit){
                maxProfit = prices[i] - minbuy;
            }            
        }
        return maxProfit;
    }
}
```

Sam:
```python=
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        
        max_profit = 0
        min_price = 10000000
        
        for i in range(len(prices)):
            if (prices[i] < min_price):
                min_price = prices[i]
            elif (prices[i] - min_price) > max_profit:
                max_profit = prices[i] - min_price
                
        return max_profit
```

## [409. Longest Palindrome](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/)
harry
```ruby=
# @param {String} s
# @return {Integer}
def longest_palindrome(s)
  occurences = s.chars.tally.values
  count = 0
  return occurences.first if occurences.size == 1

  sum = 0
  occurences.each do |occur|
    count += if occur.even?
               occur
             else
               occur - 1
             end
    sum += occur
  end

  count += 1 if sum > count
  count
end

#NOTE: tally 
s = "abbccc"
s.chars.tally
# {
#   a: 1, b:2, c:3
# }

```

beny
```csharp=
public class Solution {
    public int LongestPalindrome(string s) {
        Dictionary<char,int> even = new Dictionary<char,int>();
        int result = 0;
        for(int i = 0; i < s.Length; i++){            
            if(!even.ContainsKey(s[i])){
                 even.Add(s[i],1);
            }else{
                if(even[s[i]] % 2 == 1){
                    result = result + 2;
                    even[s[i]] = 2;
                }else{
                    even[s[i]] = 1;                    
                }        
            }           
        }        
        if(even.ContainsValue(1)){
            result += 1;
        }
        return result;
    }
}
```

Hazel:

```javascript=
function longestPalindrome(s) {
  let mapping = {};
  let result = 0;
  for (let i = 0; i < s.length; i++) {
    if (!mapping[s[i]]) {
      mapping[s[i]] = 1;
    } else {
      result += 2;
      mapping[s[i]] = 0;
    }
  }
  if (Object.values(mapping).some((e) => e === 1)) {
    return (result += 1);
  }
  return result;
}
```

Sam:
```python=
class Solution:
    def longestPalindrome(self, s: str) -> int:
        
        count_map = dict()
        
        for c in s:
            if c not in count_map:
                count_map[c] = 1
            else:
                count_map[c] += 1
        
        pair_count = 0
        has_middle_word = False
        for k,v in count_map.items():
            pair_count += v // 2
            if v % 2 ==1:
                has_middle_word = True
                
        return pair_count * 2 + 1 if has_middle_word else pair_count * 2
```
