int pivotIndex(vector<int>& nums) {
if(nums.size() == 0) return -1;
if(nums.size() == 1) return 0;
int l = 0, r = 0;
for(int i=1; i< nums.size(); i++) r += nums[i];
int i = 0;
while(l != r) {
l += nums[i];
i++;
if(i == nums.size()) break;
r -= nums[i];
}
if(i == nums.size()) return -1;
else return i;
}
Showing posts with label Array. Show all posts
Showing posts with label Array. Show all posts
Saturday, November 11, 2017
Saturday, October 28, 2017
717. 1-bit and 2-bit Characters
bool isOneBitCharacter(vector<int>& bits) {
if(bits.back() == 1) return false;
if(bits.size() == 1) return true;
for(int i=0; i<bits.size();) {
if(bits[i] == 1) i += 2;
else i++;
if(i == bits.size()-1) return true;
}
return false;
}
if(bits.back() == 1) return false;
if(bits.size() == 1) return true;
for(int i=0; i<bits.size();) {
if(bits[i] == 1) i += 2;
else i++;
if(i == bits.size()-1) return true;
}
return false;
}
Thursday, October 5, 2017
238. Product of Array Except Self
https://leetcode.com/problems/product-of-array-except-self/description/
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> res(n,1);
int forward = 1, backward = 1;
for(int i=0; i<n; i++) {
res[i] *= forward;
res[n-1-i] *= backward;
forward *= nums[i];
backward *= nums[n-1-i];
}
return res;
}
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> res(n,1);
int forward = 1, backward = 1;
for(int i=0; i<n; i++) {
res[i] *= forward;
res[n-1-i] *= backward;
forward *= nums[i];
backward *= nums[n-1-i];
}
return res;
}
Wednesday, September 27, 2017
442. Find All Duplicates in an Array
https://leetcode.com/problems/find-all-duplicates-in-an-array/description/
Solution 1. swap number i to index i-1
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
int i=0;
while(i<nums.size()) {
if(nums[i] != nums[nums[i]-1])
swap(nums[i], nums[nums[i]-1]);
else i++;
}
for(int i=0; i<nums.size(); i++) {
if(i+1 != nums[i]) res.push_back(nums[i]);
}
return res;
}
Solution 2. Mark by +/-
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
for(int i=0; i<nums.size(); i++) {
nums[abs(nums[i])-1] = -nums[abs(nums[i])-1];
if(nums[abs(nums[i])-1]>0) res.push_back(abs(nums[i]));
}
return res;
}
Solution 3. counting number nums[i] by adding n to index i-1
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
int n = nums.size();
for(int i=0; i<n; i++) {
nums[(nums[i]-1)%n] += n;
}
for(int i=0; i<n; i++) {
if(nums[i]>2*n) res.push_back(i+1);
}
return res;
}
Solution 1. swap number i to index i-1
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
int i=0;
while(i<nums.size()) {
if(nums[i] != nums[nums[i]-1])
swap(nums[i], nums[nums[i]-1]);
else i++;
}
for(int i=0; i<nums.size(); i++) {
if(i+1 != nums[i]) res.push_back(nums[i]);
}
return res;
}
Solution 2. Mark by +/-
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
for(int i=0; i<nums.size(); i++) {
nums[abs(nums[i])-1] = -nums[abs(nums[i])-1];
if(nums[abs(nums[i])-1]>0) res.push_back(abs(nums[i]));
}
return res;
}
Solution 3. counting number nums[i] by adding n to index i-1
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
int n = nums.size();
for(int i=0; i<n; i++) {
nums[(nums[i]-1)%n] += n;
}
for(int i=0; i<n; i++) {
if(nums[i]>2*n) res.push_back(i+1);
}
return res;
}
419. Battleships in a Board
https://leetcode.com/problems/battleships-in-a-board/description/
int countBattleships(vector<vector<char>>& board) {
int res = 0;
for(int i=0; i<board.size(); i++)
for(int j=0; j<board[0].size(); j++) {
if(board[i][j] == 'X') {
if(i!=0 && j!=0)
res += (board[i-1][j] != 'X' && board[i][j-1] != 'X');
else if(i==0 && j!=0)
res += (board[i][j-1] != 'X');
else if(i!=0 && j==0)
res += (board[i-1][j] != 'X');
else res++;
}
}
return res;
}
int countBattleships(vector<vector<char>>& board) {
int res = 0;
for(int i=0; i<board.size(); i++)
for(int j=0; j<board[0].size(); j++) {
if(board[i][j] == 'X') {
if(i!=0 && j!=0)
res += (board[i-1][j] != 'X' && board[i][j-1] != 'X');
else if(i==0 && j!=0)
res += (board[i][j-1] != 'X');
else if(i!=0 && j==0)
res += (board[i-1][j] != 'X');
else res++;
}
}
return res;
}
Friday, September 15, 2017
581. Shortest Unsorted Continuous Subarray
https://leetcode.com/problems/shortest-unsorted-continuous-subarray/description/
int findUnsortedSubarray(vector<int>& nums) {
nums.insert(nums.begin(), INT_MIN);
nums.push_back(INT_MAX);
int l = 0, h = nums.size() - 1;
for(int i=1; i<nums.size()-1; i++ ) {
if(nums[i]<nums[l]) {
while(nums[i]<nums[l]) l--;
}
else if(l == i-1) l++;
}
for(int i=nums.size()-2; i>=0; i-- ) {
if(nums[i]>nums[h]) {
while(nums[i]>nums[h]) h++;
}
else if(h == i+1) h--;
}
return max(h-l-1, 0);
}
int findUnsortedSubarray(vector<int>& nums) {
nums.insert(nums.begin(), INT_MIN);
nums.push_back(INT_MAX);
int l = 0, h = nums.size() - 1;
for(int i=1; i<nums.size()-1; i++ ) {
if(nums[i]<nums[l]) {
while(nums[i]<nums[l]) l--;
}
else if(l == i-1) l++;
}
for(int i=nums.size()-2; i>=0; i-- ) {
if(nums[i]>nums[h]) {
while(nums[i]>nums[h]) h++;
}
else if(h == i+1) h--;
}
return max(h-l-1, 0);
}
Thursday, September 14, 2017
475. Heaters
https://leetcode.com/problems/heaters/description/
int findRadius(vector<int>& houses, vector<int>& heaters) {
sort(houses.begin(), houses.end());
sort(heaters.begin(), heaters.end());
int maxRg = 0, j = 0;
for(int i=0; i<houses.size(); i++) {
int h, minh = abs(heaters[j] - houses[i]);
while(j+1<heaters.size()) {
h = abs(heaters[j+1] - houses[i]);
if(h<=minh) {
minh = min(minh, h);
j++;
}
else {
break;
}
}
maxRg = max(maxRg, minh);
}
return maxRg;
}
int findRadius(vector<int>& houses, vector<int>& heaters) {
sort(houses.begin(), houses.end());
sort(heaters.begin(), heaters.end());
int maxRg = 0, j = 0;
for(int i=0; i<houses.size(); i++) {
int h, minh = abs(heaters[j] - houses[i]);
while(j+1<heaters.size()) {
h = abs(heaters[j+1] - houses[i]);
if(h<=minh) {
minh = min(minh, h);
j++;
}
else {
break;
}
}
maxRg = max(maxRg, minh);
}
return maxRg;
}
Wednesday, September 13, 2017
88. Merge Sorted Array
https://leetcode.com/problems/merge-sorted-array/description/
Merge from high index.
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(nums2.size() == 0) return;
for(int i=m-1, j=n-1, k=m+n-1; k>=0; k--) {
if(i<0) {
nums1[k] = nums2[j--];
continue;
}
if(j<0) return;
if(nums1[i]<=nums2[j]) nums1[k] = nums2[j--];
else nums1[k] = nums1[i--];
}
}
Merge from high index.
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(nums2.size() == 0) return;
for(int i=m-1, j=n-1, k=m+n-1; k>=0; k--) {
if(i<0) {
nums1[k] = nums2[j--];
continue;
}
if(j<0) return;
if(nums1[i]<=nums2[j]) nums1[k] = nums2[j--];
else nums1[k] = nums1[i--];
}
}
Sunday, September 10, 2017
38. Count and Say
https://leetcode.com/problems/count-and-say/description/
Solution 1. (0 ms)
string countAndSay(int n) {
if(n==1) return "1";
string s = countAndSay(n-1);
string res = "";
int cnt = 1;
for(int i=1; i<s.size(); i++) {
if(s[i] != s[i-1]) {
res.push_back('0' + cnt);
res.push_back(s[i-1]);
cnt = 1;
}
else {
cnt++;
}
}
res.push_back('0' + cnt);
res.push_back(s.back());
return res;
}
Solution 1.1 (3 ms)
res += to_string(cnt) + s[i-1]; is slower than res.push_back('0' + cnt); res.push_back(s[i-1]);
string countAndSay(int n) {
if(n==1) return "1";
string s = countAndSay(n-1);
string res = "";
int cnt = 1;
for(int i=1; i<s.size(); i++) {
if(s[i] != s[i-1]) {
res += to_string(cnt) + s[i-1];
cnt = 1;
}
else {
cnt++;
}
}
res += to_string(cnt) + s.back();
return res;
}
Solution 1. (0 ms)
string countAndSay(int n) {
if(n==1) return "1";
string s = countAndSay(n-1);
string res = "";
int cnt = 1;
for(int i=1; i<s.size(); i++) {
if(s[i] != s[i-1]) {
res.push_back('0' + cnt);
res.push_back(s[i-1]);
cnt = 1;
}
else {
cnt++;
}
}
res.push_back('0' + cnt);
res.push_back(s.back());
return res;
}
Solution 1.1 (3 ms)
res += to_string(cnt) + s[i-1]; is slower than res.push_back('0' + cnt); res.push_back(s[i-1]);
string countAndSay(int n) {
if(n==1) return "1";
string s = countAndSay(n-1);
string res = "";
int cnt = 1;
for(int i=1; i<s.size(); i++) {
if(s[i] != s[i-1]) {
res += to_string(cnt) + s[i-1];
cnt = 1;
}
else {
cnt++;
}
}
res += to_string(cnt) + s.back();
return res;
}
Saturday, September 9, 2017
26. Remove Duplicates from Sorted Array
https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/
Solution 1. Loop through the array, when see a none duplicated number, copy it to location s and s++.
int removeDuplicates(vector<int>& nums) {
if(nums.size()<2) return nums.size();
int s=1;
for(int i=1; i<nums.size(); i++) {
if(nums[i] != nums[i-1]) {
nums[s] = nums[i];
s++;
}
}
nums.erase(nums.begin()+s, nums.end());
return s;
}
Solution 2. Remove when see duplicates. (slow)
int removeDuplicates(vector<int>& nums) {
if(nums.size()<2) return nums.size();
for(vector<int>::iterator it = nums.begin()+1; it<nums.end();) {
if(*it == *(it-1)) nums.erase(it);
else it++;
}
return nums.size();
}
Solution 1. Loop through the array, when see a none duplicated number, copy it to location s and s++.
int removeDuplicates(vector<int>& nums) {
if(nums.size()<2) return nums.size();
int s=1;
for(int i=1; i<nums.size(); i++) {
if(nums[i] != nums[i-1]) {
nums[s] = nums[i];
s++;
}
}
nums.erase(nums.begin()+s, nums.end());
return s;
}
Solution 2. Remove when see duplicates. (slow)
int removeDuplicates(vector<int>& nums) {
if(nums.size()<2) return nums.size();
for(vector<int>::iterator it = nums.begin()+1; it<nums.end();) {
if(*it == *(it-1)) nums.erase(it);
else it++;
}
return nums.size();
}
Friday, September 8, 2017
119. Pascal's Triangle II
https://leetcode.com/problems/pascals-triangle-ii/description/
Solution 1. Iteration
rowIndex row
i = 0 1 0 0 0 0
i = 1 1 1 0 0 0
i = 2 1 2 1 0 0
i = 3 1 3 3 1 0
i represents the ith row of the pascals triangle
j is the index on ith row, index loops from high to low
vector<int> getRow(int rowIndex) {
vector<int> r(rowIndex+1, 0);
r[0] = 1;
for(int i=1; i<rowIndex+1; i++) {
for(int j=i; j>=1; j--)
r[j] += r[j-1];
}
return r;
}
Solution 2. recursion
vector<int> getRow(int rowIndex) {
if(rowIndex == 0) return {1};
vector<int> r = getRow(rowIndex - 1);
r.push_back(1);
for(int i=1, n, m=r[0]; i<r.size()-1; i++) {
n = r[i];
r[i] = m + r[i];
m = n;
}
return r;
}
Solution 1. Iteration
rowIndex row
i = 0 1 0 0 0 0
i = 1 1 1 0 0 0
i = 2 1 2 1 0 0
i = 3 1 3 3 1 0
i represents the ith row of the pascals triangle
j is the index on ith row, index loops from high to low
vector<int> getRow(int rowIndex) {
vector<int> r(rowIndex+1, 0);
r[0] = 1;
for(int i=1; i<rowIndex+1; i++) {
for(int j=i; j>=1; j--)
r[j] += r[j-1];
}
return r;
}
Solution 2. recursion
vector<int> getRow(int rowIndex) {
if(rowIndex == 0) return {1};
vector<int> r = getRow(rowIndex - 1);
r.push_back(1);
for(int i=1, n, m=r[0]; i<r.size()-1; i++) {
n = r[i];
r[i] = m + r[i];
m = n;
}
return r;
}
Tuesday, September 5, 2017
66. Plus One
https://leetcode.com/problems/plus-one/description/
vector<int> plusOne(vector<int>& digits) {
int c = 1, t;
for(int i=digits.size()-1; i>=0 && c; i--) {
digits[i] += c;
c = digits[i]/10;
digits[i] %= 10;
}
if(c) digits.insert(digits.begin(), 1);
return digits;
}
vector<int> plusOne(vector<int>& digits) {
int c = 1, t;
for(int i=digits.size()-1; i>=0 && c; i--) {
digits[i] += c;
c = digits[i]/10;
digits[i] %= 10;
}
if(c) digits.insert(digits.begin(), 1);
return digits;
}
Subscribe to:
Posts (Atom)