public class Solution {
public int SumOfUnique(int[] nums) {
var hs =
from n in nums
group n by n into g
where g.Count() == 1
select g.Key;
return hs.Sum();
}
}
Source: https://leetcode.com/problems/sum-of-unique-elements/submissions/
"Simplicity can't be bought later, it must be earned from the start" -- DB
Showing posts with label leetcode. Show all posts
Showing posts with label leetcode. Show all posts
Monday, April 5, 2021
Leetcode Everyday: 1748. Sum of Unique Elements. Easy
Monday, March 29, 2021
Leetcode Everyday: 617. Merge Two Binary Trees. Easy
public class Solution {
public TreeNode MergeTrees(TreeNode root1, TreeNode root2) =>
root1 != null || root2 != null ?
new TreeNode(
(root1?.val ?? 0) + (root2?.val ?? 0),
MergeTrees(root1?.left, root2?.left),
MergeTrees(root1?.right, root2?.right)
)
:
null;
}
// TODO: optimize without allocating
Source: https://leetcode.com/problems/merge-two-binary-trees/
Saturday, March 20, 2021
Leetcode Everyday: 728. Self Dividing Numbers. Easy
public class Solution {
public IList<int> SelfDividingNumbers(int left, int right) {
var list = new List<int>();
for (var i = left; i <= right; ++i) {
for (var n = i; n > 0; n /= 10) {
var toDivide = n % 10;
if (toDivide == 0 || i % toDivide != 0) {
goto goNextNumber;
}
}
list.Add(i);
goNextNumber:;
}
return list;
}
}
Source: https://leetcode.com/problems/self-dividing-numbers/
Tuesday, March 16, 2021
Leetcode Everyday: 1351. Count Negative Numbers in a Sorted Matrix. Easy
public int CountNegatives(int[][] grid) {
var count = 0;
foreach (var line in grid) {
for (var i = 0; i < line.Length; ++i) {
if (line[i] <0) {
count += line.Length - i;
break;
}
}
}
return count;
}
// TODO: Create a binary search approach
Functional:
public class Solution {
public int CountNegatives(int[][] grid) => grid.SelectMany(line => line).Count(n => n < 0);
}
Source: https://leetcode.com/problems/count-negative-numbers-in-a-sorted-matrix/
Sunday, March 14, 2021
Leetcode Everyday: 1464. Maximum Product of Two Elements in an Array. Easy
public class Solution {
public int MaxProduct(int[] nums) {
// first and second highest
var first = 0;
var second = 0;
foreach (var n in nums) {
if (n > first) {
(first, second) = (n, first);
} else if (n > second) {
second = n;
}
}
return (first - 1) * (second - 1);
}
}
Functional Programming:
public class Solution {
public int MaxProduct(int[] nums) =>
nums.OrderByDescending(n => n).Take(2)
.Aggregate((a, b) => (a-1) * (b-1));
}
Source: https://leetcode.com/problems/maximum-product-of-two-elements-in-an-array/
Saturday, March 13, 2021
Leetcode Everyday: 1374. Generate a String With Characters That Have Odd Counts. Easy
public class Solution {
public string GenerateTheString(int n) =>
new string('a', n - (n%2 ^ 1)) + new string('b', 1 - n%2);
}
Source: https://leetcode.com/problems/generate-a-string-with-characters-that-have-odd-counts/
Wednesday, March 10, 2021
Leetcode Everyday: 1304. Find N Unique Integers Sum up to Zero. Easy
public class Solution {
public int[] SumZero(int n) {
var list = new int[n];
var ndx = 0;
for (var i = 1; i <= n / 2; ++i) {
list[ndx++] = i;
list[ndx++] = -i;
}
if (n % 2 == 1) {
list[ndx] = 0;
}
return list;
}
}
Alternative:
public class Solution {
public int[] SumZero(int n) {
var list = new int[n];
for (int i = 1, ndx = 0; i <= n / 2; ++i, ndx += 2) {
list[ndx] = i;
list[ndx+1] = -i;
}
if (n % 2 == 1) {
list[^1] = 0;
}
return list;
}
}
This works, but is confusing:
public class Solution {
public int[] SumZero(int n) {
var list = new int[n];
var i = 0;
while (i < n / 2) {
list[i++] = i;
list[^i] = -i;
}
if (n % 2 == 1) {
list[i] = 0;
}
return list;
}
}
Source: https://leetcode.com/problems/find-n-unique-integers-sum-up-to-zero/submissions/
Leetcode Everyday: 1370. Increasing Decreasing String. Easy
public class Solution {
public string SortString(string s) {
var sorted = s.Distinct().OrderBy(x => x).ToList();
var sortedDesc = sorted.OrderByDescending(x => x).ToList();
var sb = new StringBuilder();
var isAscending = true;
for (; s.Length > 0; isAscending = !isAscending) {
var toSort = isAscending ? sorted : sortedDesc;
foreach (var c in toSort) {
var i = s.IndexOf(c);
if (i >= 0) {
s = s.Remove(i, 1);
sb.Append(c);
}
}
}
return sb.ToString();
}
}
Optimized
public class Solution {
public string SortString(string s) {
const int z = 26;
var freq = new int[z];
var sLength = s.Length;
var sb = new char[sLength]; // think of this as StringBuilder
foreach (var c in s){
++freq[c - 'a'];
}
for (var i = 0; i < sLength; ){
for (var small = 0; small < z; ++small){
if (freq[small] > 0){
--freq[small];
sb[i] = (char)('a' + small);
++i;
}
}
for (var large = z - 1; large >= 0; --large){
if (freq[large] > 0){
--freq[large];
sb[i] = (char)('a' + large);
++i;
}
}
}
return new string(sb);
}
}
Source: https://leetcode.com/problems/increasing-decreasing-string/submissions/
Monday, March 8, 2021
Leetcode Everyday: 1704. Determine if String Halves Are Alike. Easy
public class Solution {
public bool HalvesAreAlike(string s) {
var half = s.Length / 2;
var a = s.Substring(0, half);
var b = s.Substring(s.Length - half, half);
var vowels = new HashSet<char>() {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
return a.Count(c => vowels.Any(v => char.ToUpper(c) == v))
== b.Count(c => vowels.Any(v => char.ToUpper(c) == v));
}
}
Optimized:
public class Solution {
public bool HalvesAreAlike(string s) {
var half = s.Length / 2;
var vowels = new HashSet<char>() {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
var count = 0;
for (var i = 0; i < half; ++i) {
if (vowels.Contains(s[i]))
++count;
if (vowels.Contains(s[^(i + 1)]))
--count;
}
return count == 0;
}
}
public class Solution {
public bool HalvesAreAlike(string s) {
var half = s.Length / 2;
var count = 0;
for (var i = 0; i < half; ++i) {
if (s[i] switch {
'A' => true,
'a' => true,
'E' => true,
'e' => true,
'I' => true,
'i' => true,
'O' => true,
'o' => true,
'U' => true,
'u' => true,
_ => false
}) {
++count;
}
if (s[(^(i + 1))] switch {
'A' => true,
'a' => true,
'E' => true,
'e' => true,
'I' => true,
'i' => true,
'O' => true,
'o' => true,
'U' => true,
'u' => true,
_ => false
}) {
--count;
}
}
return count == 0;
}
}
Source: https://leetcode.com/problems/determine-if-string-halves-are-alike/
Sunday, March 7, 2021
Leetcode Everyday: 1436. Destination City. Easy
public class Solution {
public string DestCity(IList<IList<string>> paths) {
var pathLookup = new Dictionary<string, string>();
foreach (var path in paths) {
pathLookup[path.First()] = path.Last();
}
var source = pathLookup.FirstOrDefault().Key;
while (pathLookup.TryGetValue(source, out string destination)) {
source = destination;
}
return source;
}
}
Functional programming:
public class Solution {
public string DestCity(IList<IList<string>> paths) =>
paths.Single(dest => !paths.Any(source => dest.Last() == source.First())).Last();
}
Optimized:
public class Solution {
public string DestCity(IList<IList<string>> paths) {
var outgoing = new HashSet<string>();
outgoing.UnionWith(paths.Select(path => path.First()));
foreach (var path in paths) {
if (!outgoing.Contains(path.Last())) {
return path.Last();
}
}
return null;
}
}
Source: https://leetcode.com/problems/destination-city/submissions/
Saturday, March 6, 2021
Leetcode Everyday: 1309. Decrypt String from Alphabet to Integer Mapping. Easy
using System.Text.RegularExpressions;
public class Solution {
public string FreqAlphabets(string s) {
var lookup = new Dictionary<string, char>();
var rx = new Regex(@"\d{2}#|\d{1}");
var alphabet = "12345678910#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#";
var c = 'a';
foreach (var match in rx.Matches(alphabet).Cast<Match>()) {
lookup[match.Value] = c++;
}
var sb = new StringBuilder();
foreach (var match in rx.Matches(s).Cast<Match>()) {
sb.Append(lookup[match.Value]);
}
return sb.ToString();
}
}
Optimized:
public class Solution {
public string FreqAlphabets(string s) {
var sb = new StringBuilder();
for (var i = 0; i < s.Length; ) {
if (i+2 < s.Length && s[i+2] == '#') {
sb.Append((char)('a' + (s[i]-'0')*10 + s[i+1]-'0' - 1));
i += 3;
} else {
sb.Append((char)('a' + s[i]-'0' - 1));
++i;
}
}
return sb.ToString();
}
}
Source: https://leetcode.com/problems/decrypt-string-from-alphabet-to-integer-mapping/
Thursday, March 4, 2021
Leetcode Everyday: 1725. Number Of Rectangles That Can Form The Largest Square. Easy
public class Solution {
public int CountGoodRectangles(int[][] rectangles) {
var minCounts = new Dictionary<int, int>();
foreach (var r in rectangles) {
var min = Math.Min(r[0], r[1]);
minCounts[min] =
(minCounts.TryGetValue(min, out int value) ? value : 0) + 1;
}
return minCounts[minCounts.Keys.Max()];
}
}
Source: https://leetcode.com/problems/number-of-rectangles-that-can-form-the-largest-square/
Wednesday, March 3, 2021
Leetcode Everyday: 1323. Maximum 69 Number. Easy
public class Solution {
public int Maximum69Number (int num) {
var sNum = num.ToString();
var foundAt = sNum.IndexOf('6');
if (foundAt >= 0) {
return num + (3 * (int)Math.Pow(10, sNum.Length - foundAt - 1));
}
return num;
}
}
Same speed as above (32ms), but uses less memory:
public class Solution {
public int Maximum69Number (int num) {
var add = 0;
for (int temp = num, step = 1; temp > 0; temp /= 10, step *= 10) {
if (temp % 10 == 6) {
add = step * 3;
}
}
return num + add;
}
}
Source: https://leetcode.com/problems/maximum-69-number/
Tuesday, March 2, 2021
Leetcode Everyday: 1572. Matrix Diagonal Sum. Easy
public class Solution {
public int DiagonalSum(int[][] mat) {
var sum = 0;
var length = mat.Length;
for (var walk = 0; walk < length; ++walk) {
sum += mat[walk][walk] + mat[^(walk + 1)][walk];
}
// exclude center
var center = Math.DivRem(length, 2, out int remainder);
if (remainder == 1) {
sum -= mat[center][center];
}
return sum;
}
}
Source: https://leetcode.com/problems/matrix-diagonal-sum/
Monday, March 1, 2021
Leetcode Everyday: 832. Flipping an Image. Easy
public class Solution {
public int[][] FlipAndInvertImage(int[][] image) {
foreach (var row in image) {
for (var col = 0; col < row.Length / 2; ++col) {
// shorthand:
(row[col], row[^(col+1)]) = (row[^(col+1)], row[col]);
// longhand:
// (row[col], row[row.Length - (col+1)]) = (row[row.Length - (col+1)], row[col]);
}
for (var col = 0; col < row.Length; ++col) {
row[col] ^= 1;
}
}
return image;
}
}
Optimized:
public class Solution {
public int[][] FlipAndInvertImage(int[][] image) {
foreach (var row in image) {
var half = row.Length / 2;
for (var col = 0; col < half; ++col) {
// shorthand:
(row[col], row[^(col+1)]) = (row[^(col+1)] ^ 1, row[col] ^ 1);
// longhand:
// (row[col], row[row.Length - (col+1)]) = (row[row.Length - (col+1)], row[col]);
}
}
if (image.Length > 0 && image[0].Length % 2 == 1) {
var middle = image[0].Length / 2;
foreach (var row in image) {
row[middle] ^= 1;
}
}
return image;
}
}
Source: https://leetcode.com/problems/flipping-an-image/
Friday, February 26, 2021
Leetcode Everyday: 1252. Cells with Odd Values in a Matrix. Easy
public class Solution {
public int OddCells(int n, int m, int[][] indices) {
var mat = new int[n, m];
foreach (var index in indices) {
var ri = index[0];
for (var col = 0; col < m; ++col) {
++mat[ri, col];
}
var ci = index[1];
for (var row = 0; row < n; ++row) {
++mat[row, ci];
}
}
// functional programming:
// return mat.Cast<int>().Count(number => number % 2 == 1);
// this would work:
// var oddCount = 0;
// for (var ni = 0; ni < n; ++ni) {
// for (var mi = 0; mi < m; ++mi) {
// oddCount += mat[ni, mi] % 2;
// }
// }
// this is better and faster. C# can look at array as if it is one-dimensional
var oddCount = 0;
foreach (var number in mat) {
oddCount += number % 2;
}
return oddCount;
}
}
Source: https://leetcode.com/problems/cells-with-odd-values-in-a-matrix/
Wednesday, February 24, 2021
Leetcode Everyday: 804. Unique Morse Code Words. Easy
Functional programming:
public class Solution {
readonly string[] morseCodes = new[] {
".-","-...","-.-.","-..",".",
"..-.","--.","....","..",".---",
"-.-",".-..","--","-.","---",
".--.","--.-",".-.","...","-",
"..-","...-",".--","-..-","-.--","--.."
};
public int UniqueMorseRepresentations(string[] words) =>
words.Select(word =>
word.Skip(1).Aggregate(
morseCodes[word[0] - 'a'].ToString(),
(txMorse, current) => txMorse + morseCodes[current - 'a']
)
).Distinct().Count();
}
Imperative programming:
public class Solution {
public int UniqueMorseRepresentations(string[] words) {
var morseCodes = new[] {
".-","-...","-.-.","-..",".",
"..-.","--.","....","..",".---",
"-.-",".-..","--","-.","---",
".--.","--.-",".-.","...","-",
"..-","...-",".--","-..-","-.--","--.."
};
var distinctMorses = new HashSet();
var buildMorse = new StringBuilder();
foreach (var word in words) {
foreach (var c in word) {
buildMorse.Append(morseCodes[c - 'a']);
}
var txMorse = buildMorse.ToString();
buildMorse.Clear();
if (!distinctMorses.Contains(txMorse)) {
distinctMorses.Add(txMorse);
}
}
return distinctMorses.Count;
}
}
Source: https://leetcode.com/problems/unique-morse-code-words/
Tuesday, February 23, 2021
Leetcode Everyday: 1021. Remove Outermost Parentheses. Easy
public class Solution {
public string RemoveOuterParentheses(string s) {
var sb = new StringBuilder();
var opList = new Dictionary<char, int> {
['('] = 1,
[')'] = -1
};
int depth = 0;
foreach (var c in s) {
var op = opList[c];
depth += op;
if (op == 1 && depth > 1 || op == -1 && depth > 0) {
sb.Append(c);
}
}
return sb.ToString();
}
}
Compact condition:
public class Solution {
public string RemoveOuterParentheses(string s) {
var sb = new StringBuilder();
// KeyValue<op, depth>
// op = 1 = increment
// op = -1 = decrement
var opList = new Dictionary<char, KeyValuePair<int, int>> {
['('] = new KeyValuePair<int, int>(1, 1),
[')'] = new KeyValuePair<int, int>(-1, 0)
};
int depth = 0;
foreach (var c in s) {
var (op, opDepth) = opList[c];
depth += op;
if (depth > opDepth) {
sb.Append(c);
}
}
return sb.ToString();
}
}
Source: https://leetcode.com/problems/remove-outermost-parentheses/
Monday, February 22, 2021
Leetcode Everyday: 1295. Find Numbers with Even Number of Digits. Easy
Functional programming:
using static System.Math;
public class Solution {
public int FindNumbers(int[] nums) =>
nums.Count(num => CountDigit(num) % 2 == 0);
public int CountDigit(int n) => (int)Max(Log10(n), 0) + 1;
}
Imperative programming:
using static System.Math;
public class Solution {
public int FindNumbers(int[] nums) {
int evenCount = 0;
foreach (var num in nums) {
if (CountDigit(num) % 2 == 0) {
++evenCount;
}
}
return evenCount;
int CountDigit(int num) {
int digit = 0;
for (; num != 0; num /= 10) {
++digit;
}
return Max(digit, 1);
}
}
}
Source: https://leetcode.com/problems/find-numbers-with-even-number-of-digits/submissions/
Leetcode Everyday: 1266. Minimum Time Visiting All Points. Easy
Functional programming:
using static System.Math;
public class Solution {
public int MinTimeToVisitAllPoints(int[][] points) =>
points.Skip(1).Aggregate(
new { count = 0, source = points.First() },
(stat, dest) =>
new
{
count = stat.count +
Max(Abs(dest[0] - stat.source[0]), Abs(dest[1] - stat.source[1])),
source = dest
}
).count;
}
Imperative programming:
using static System.Math;
public class Solution {
public int MinTimeToVisitAllPoints(int[][] points) {
var count = 0;
var source = points.First();
foreach (var dest in points.Skip(1)) {
var lengthX = dest[0] - source[0];
var lengthY = dest[1] - source[1];
count += Max(Abs(lengthX), Abs(lengthY));
source = dest;
}
return count;
}
}
Source: https://leetcode.com/problems/minimum-time-visiting-all-points/
Subscribe to:
Posts (Atom)