关于算法与数据结构的相关博文:
二叉树相关练习题(C++)
经典排序算法的C++实现
与字符串有关的一些典型问题的C++解法
一些可以用动态规划(DP)算法解决的问题(C++)
排列组合相关笔试面试题(C++)
与概率相关的算法题C++解法(附证明过程)
二分查找的巧妙运用(C++)
位运算在算法题中的使用(C++)
链表相关练习题(C++)
用实例讲解栈和队列(C++)
一些智力题的C++解法
KMP算法相关学习资料
LeetCode经典题目笔记(一)
九、判断链表是否是回文链表
解法:O(N)\O(N)的解法。
class
Solution {
public
:
ListNode* temp;
bool
isPalindrome(ListNode* head) {
temp = head;
return
check(head);
}
bool
check(ListNode* p) {
if
(
NULL
== p)
return
true
;
bool
isPal = check(p->next) & (temp->val == p->val);
temp = temp->next;
return
isPal;
}
十、找出无序数组中出现次数大于n/2的数
解法一、用库函数
nth_element(nums.begin(), nums.begin() + nums.size() /
2
, nums.end());
public
:
int
majorityElement(
vector<
int
>
& nums) {
nth_element(nums.begin(), nums.begin() + nums.size() /
2
, nums.end());
return
nums[nums.size() /
2
];
解法二、随机枚举(居然是最快的-_-)
class
Solution {
public
:
int
majorityElement(
vector<
int
>
& nums) {
int
n = nums.size();
srand(
unsigned
(time(
NULL
)));
while
(
true
) {
int
idx = rand() % n;
int
candidate = nums[idx];
int
counts =
0
;
for
(
int
i =
0
; i < n; i++)
if
(nums[i] == candidate)
counts++;
if
(counts > n /
2
)
return
candidate;
解法三、
class
Solution {
public
:
int
majorityElement(
vector<
int
>
& nums) {
int
major, counts =
0
, n = nums.size();
for
(
int
i =
0
; i < n; i++) {
if
(!counts) {
major = nums[i]; counts =
1
;
}
else
counts += (nums[i] == major) ?
1
: -
1
;
}
return
major;
}
};
十一、删除排序数组中重复的元素
解法:遍历一遍,记录下已遍历的元素中重复的个数,把元素向前移动重复个数位置就行了。
class
Solution {
public
:
int
removeDuplicates(vector<
int
>& nums) {
for
(
int
i =
1
; i < nums.size(); i++){
if
(nums[i] == nums[i-
1
]) count++;
else
nums[i-count] = nums[i];
}
return
nums.size()-count;
十二、一个字符串只含大小写字符和空格,返回字符串中最后一个单词的长度
解法:遍历一遍,统计每个单词的长度,若遇到空格则把前一个单词的长度置0.
class
Solution {
public
:
int
lengthOfLastWord(string s) {
int
len =
0
;
for
(
int
i =
0
;i < s.size();) {
if
(s[i++] != ' ') len++;
else if
(s[i] != '\
0
'&&s[i] != ' ') len =
0
;
}
return
len;
}
};
class
Solution {
public
:
TreeNode* invertTree(TreeNode* root) {
if
(!root)
return
root;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return
root;
}
};
class
Solution {
public
:
TreeNode* invertTree(TreeNode* root) {
stack s;
s.push(root);
while
(!s.empty()) {
TreeNode* temp = s.top();
s.pop();
if
(temp) {
swap(temp->left,temp->right);
s.push(temp->right);
s.push(temp->left);
}
}
十四、Happy数的判断
解法:利用链表判环方法,快慢”指针“。Happy数最终会以1结束,非Happy数会无限循环,所以只需要判断是否出现环即可。
class
Solution {
public
:
int
digitSquareSum(
int
n) {
sum += tmp * tmp;
n /=
10
;
slow = digitSquareSum(slow);
fast = digitSquareSum(fast);
fast = digitSquareSum(fast);
if
(fast ==
1
)
return
1
;