I’m Gonna Make Him An Offer He Can’t Refuse——The Godfather
LeetCode 217. Contains Duplicate
题目:https://leetcode.com/problems/contains-duplicate/
思路:弄个哈希表啊或者现成的用哈希(或者XX树)的容器就行了
代码:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
set<int> numSet;
int numSize = nums.size();
for (int i = 0; i<numSize; i++) {
if (numSet.count(nums[i]) == 0)
numSet.insert(nums[i]);
else
return true;
}
return false;
}
};
Cisco Linksys EA3500 OpenWrt Snapshot镜像
仅限Snapshot版本r48648使用,需要自己搭服务器的可以参考我的帖子http://boweihe.me/?p=1537
没有Luci界面的,可以直接修改/etc/opkg/distfeeds.conf 这个文件。LuCi界面下等效的。
src/gz designated_driver_base http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/base src/gz designated_driver_kernel http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/kernel src/gz designated_driver_luci http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/luci src/gz designated_driver_management http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/management src/gz designated_driver_packages http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/packages src/gz designated_driver_routing http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/routing src/gz designated_driver_telephony http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/telephony # src/gz designated_driver_targets http://hk.boweihe.me/downloads.openwrt.org/snapshots/trunk/kirkwood/generic/packages/targets
LeetCode 242. Valid Anagram
原题:https://leetcode.com/problems/valid-anagram/
思路:Anagram就是指两个单词(一说句子也行)里面字符的种类、数量一样,但是能拼出不同的词。所以思路就是统计里面的字符频率就行。
代码:
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size())
return false;
int stable[26] = {0};
int ttable[26] = {0};
for(int i=0; i<s.size(); i++){
stable[s[i] - 'a'] ++;
ttable[t[i] - 'a'] ++;
}
for(int i=0; i<26; i++){
if (stable[i] != ttable[i])
return false;
}
return true;
}
};
LeetCode 283. Move Zeroes
题目:https://leetcode.com/problems/move-zeroes/
思路:
说是把0 挪到后面去,其实等同于把非0值往前挪。挪到什么地方呢?就得找个东西记录可以往前挪的“坑”。而这个“坑”有两种情况:
1.原来的值就是0的;
2.如果把当前的非0值往前面挪过了,那当前的位置也就空缺;
从一开始记录一下找到的0的个数,把非0值挪完了以后,最后几位写成0就行。
这一切的时间复杂度为O(n)
代码(用到了队列来存储坑的位置):
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int size = nums.size();
int zeroCount = 0;
queue<int> availIndices;
for(int i=0; i < size; i++){
if(nums[i] == 0){
zeroCount ++;
availIndices.push(i);
} else {
if(!availIndices.empty()) {
//Move forward
int index =availIndices.front();
availIndices.pop();
nums[index] = nums[i];
//Mark i as empty
availIndices.push(i);
}
}
}
for(int i = size - zeroCount; i < size; i++) {
nums[i] = 0;
}
}
};
LeetCode #100. Same Tree
题目:https://leetcode.com/problems/same-tree/
分析:注意判断NULL情况,用递归做
代码:(秒AC有木有!)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(p == NULL && q == NULL)
return true;
if(p == NULL || q == NULL)
return false;
if(p->val != q->val)
return false;
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
};
前端测试服务 by aliyun
感觉很给力的样子,一天有俩小时的时间可以用,从IE6开始的浏览器兼容性测试,竟然是跑虚拟机的!
http://fts.aliyun.com/
LeetCode #226. Invert Binary Tree
题目:https://leetcode.com/problems/invert-binary-tree/
思路:这TM还要思路?
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == NULL)
return root;
TreeNode *tmpNode = root->right;
root->right = root->left;
root->left = tmpNode;
if(root->left != NULL)
invertTree(root->left);
if(root->right != NULL)
invertTree(root->right);
return root;
}
};
珍惜眼前的一切,然后加油。
LeetCode #4. Median of Two Sorted Arrays
题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/
参考文献:
思路:
实在是脑子转不过来,看了一下解法,然后就把自己的理解讲一下吧。
有两个规律需要说下:
1.在某个数列头尾删去相同数量的元素,其中位数是不变的。比如[1,2,3,4]删去1和4.
2.如果两个数列的中位数是m1, m2,那么合并后的数列的中位数的值肯定在[m1,m2]范围内。
既然题目是要Log级别的复杂度,就要想到要用折半法把问题的规模降低…举个例子,假设有[1,2,4,6,6,8]和[1,5,7,8,10,25,36]两个数列,很容易算出他们的(前序 )中位数分别是4和8,而他们合并后的中位数的值在[4,8]之间。
然后可以删去无用的值,[1,2]与[10,25,36]. 但由于规律1的限制,如果后面删了3个的话,合并后删减的数列会发生变化(本例中奇偶性都变了),我们只能删去min(2,3)=2个元素…这种删值从理论上讲就是折半了,然后搞一波递归就行了。
最最最基本的思路如下:
两个有序数列Ary1, Ary2(假设升序排列)的中位数分别为m1,m2
if m1 == m2:
LUCKY!!!
elif m1 < m2:
取(Ary1的后半段,Ary2的前半段)再算
else
取(Ary1的前半段,Ary2的后半段)再算
由于题设里面俩数组是不等长的,所以里对其中某个数组n<=2时处理方法需要注意…
代码:
int max(int x, int y) {
return x>y ? x : y;
}
int min(int x, int y) {
return x<y ? x : y;
}
double getMedian(int* nums, int size) {
if (size == 0)
return -1;
if (size % 2 == 0) {
//Even number
return (nums[size / 2] + nums[size / 2 - 1]) / 2.0;
}
else {
return nums[(size - 1) / 2];
}
}
double findMedianMerge(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int count = 0;
int n1Count = 0;
int totalSize = nums1Size + nums2Size;
int t1, t2;
if (totalSize % 2 == 0) {
t1 = totalSize / 2;
t2 = t1 + 1;
}
else {
t1 = -1;
t2 = totalSize / 2 + 1;
}
double sum = 0;
int curVal;
while (n1Count < nums1Size) {
if (*nums1 < *nums2) {
n1Count++;
curVal = *nums1;
nums1++;
}
else {
curVal = *nums2;
nums2++;
}
count++;
if (count == t1 || count == t2) {
sum += curVal;
}
else if (count >= t2) {
break;
}
}
if (count < t1) {
//Not finished
nums2 += (t1 - count - 1);
count = t1;
sum += *nums2;
nums2++;
}
if (count < t2) {
nums2 += (t2 - count - 1);
sum += *nums2;
}
if (t1 == -1)
return sum;
else
return sum / 2.0;
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int totalSize = nums1Size + nums2Size;
if (nums1Size > nums2Size) {
//Keep ary1 shorter than ary2
int* temp = nums1;
int t = nums1Size;
nums1 = nums2;
nums1Size = nums2Size;
nums2 = temp;
nums2Size = t;
}
if (nums1Size == 0) {
return getMedian(nums2, nums2Size);
} else if (nums1Size == 1) {
if (nums2Size == 1) {
return (nums1[0] + nums2[0]) / 2.0;
}
else {
return findMedianMerge(nums1, nums1Size, nums2, nums2Size);
}
}
else if (nums1Size == 2) {
if (nums2Size == 2) {
return (max(nums1[0], nums2[0]) + min(nums1[1], nums2[1])) / 2.0;
}
else {
return findMedianMerge(nums1, nums1Size, nums2, nums2Size);
}
}
//Slice
double m1 = getMedian(nums1, nums1Size);
double m2 = getMedian(nums2, nums2Size);
if (m1 == m2) {
//Got lucky
return m1;
}
else if (m1 < m2) {
//Slice L-nums1 and R-nums2
int cut = (nums1Size - 1) / 2;
return findMedianSortedArrays(nums1 + cut, nums1Size - cut, nums2, nums2Size - cut);
}
else {
//Slice R-nums1 and L-nums2
int cut = (nums1Size - 1) / 2;
return findMedianSortedArrays(nums1, nums1Size - cut, nums2 + cut, nums2Size - cut);
}
}