Problem 136. Single Number
-
题目描述
Given a non-empty array of integers, every element appears twice except for one. Find that single one.Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example:
Input: [2,2,1] Output: 1
-
解题思路
要在线性时间内求出数组中落单的数,且不能开辟过多的空间,最好的办法就是使用“异或”运算。对两个相同的数求异或之后,得到的结果为0,所以在对所有数进行异或操作之后,得到的结果就是落单的那个数了。 -
代码实现
class Solution {
public:
int singleNumber(vector<int>& nums) {
for(int i = 1; i < nums.size(); ++i)
nums[0] ^= nums[i];
return nums[0];
}
};
Problem 155. Min Stack
-
题目描述
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
getMin() – Retrieve the minimum element in the stack.Example:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> Returns -3. minStack.pop(); minStack.top(); --> Returns 0. minStack.getMin(); --> Returns -2.
-
解题思路
定义两个 stack< int> 变量 dataStack 和 minStack,其中 dataStack 用来管理 MinStack 对象的数据操作如 push 和 pop,minStack 用来存储 push 进来的最小值。在求最小值时,只需返回 minStack.pop() 即可。 -
代码实现
class MinStack {
public:
MinStack() {}
void push(int x) {
dataStack.push(x);
if(minStack.empty())
minStack.push(x);
else{
int min = minStack.top();
if(min >= x)
minStack.push(x);
}
}
void pop() {
int n = dataStack.top();
int min = minStack.top();
dataStack.pop();
if(n == min)
minStack.pop();
}
int top() {
return dataStack.top();
}
int getMin() {
return minStack.top();
}
private:
stack<int> dataStack;
stack<int> minStack;
};
Problem 160. Intersection of Two Linked Lists
-
题目描述
Write a program to find the node at which the intersection of two singly linked lists begins. -
解题思路
若要求链表headA和headB的公共开始节点,假设此节点为res,则从res节点开始两个链表往下的长度是一致的。解题思路如下:
- 分别求出headA和headB的长度len1和len2,以及len1和len2的差值k,令较长的链表向前移动k步,则此时两个链表往下的长度相等。
- 对headA和headB所指的内存空间进行判断,如果相等则此节点为公共开始节点,否则继续向下找。
- 代码实现
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int len1 = length(headA);
int len2 = length(headB);
if(len1 < len2)
for(int i = 0; i < len2-len1; ++i)
headB = headB->next;
else
for(int i = 0; i < len1-len2; ++i)
headA = headA->next;
ListNode * res = NULL;
while(headA && headB){
if(headA == headB){
res = headA;
break;
}
headA = headA -> next;
headB = headB -> next;
}
return res;
}
int length(ListNode * node){
if(node == NULL)
return 0;
int count = 1;
while(node->next != NULL){
count ++;
node = node->next;
}
return count;
}
};
Problem 169. Majority Element
-
题目描述
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.You may assume that the array is non-empty and the majority element always exist in the array.
Example:
Input: [3,2,3] Output: 3
-
解题思路
要求出给定数组nums中出现次数超过一半的元素,若规定了时间复杂度为 O(N),空间复杂度为 O(1),则可以采用“多数投票算法”。
该算法的原理如下:
-
先假设数组的首元素 candidate 为获票最多的人,它所拥有的票数 cnt 为1;
-
对后续元素进行遍历,如果 nums[i] == candidate,则 cnt++(意味着后面又有人给 candidate 投票),否则 cnt–(抵消了 candidate 的一票)。
-
判断 cnt 的大小,如果为 0 表示当前 candidate 的票数被抵消了,此时选取下一个 nums[i] 为新的 candidate,并重复此过程。
该算法的巧妙性在于,如果存在某一个 candidate 获得了超过半数的投票,那么无论有多少反对票,都无法将它的 cnt 抵消为 0,该 candidate 总能够胜出。所以,对于数组 nums,只要返回最后的 candidate 的值即可。
- 代码实现
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = nums[0];
int cnt = 1;
for(int i = 1; i < nums.size(); ++i){
if(cnt == 0){
candidate = nums[i];
cnt = 1;
}
else{
if(nums[i] == candidate)
cnt++;
else
cnt--;
}
}
return candidate;
}
};
Problem 171. Excel Sheet Column Number
-
题目描述
Given a column title as appear in an Excel sheet, return its corresponding column number.For example:
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
-
解题思路
本题相当于将一个26进制数(字母表有26个字母),转化为十进制数。原理较简单,代码如下: -
代码实现
class Solution {
public:
int titleToNumber(string s) {
int len = s.length();
int res = 0;
if(len == 0)
return res;
for(int i = 0; i < len; ++i){
res = res * 26 + (s[i]-'A' + 1);
}
return res;
}
};