1. Single Number 1
题目描述:
given an array of integres, every elements 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?
采用异或,不仅能处理两次的情况,只要出现偶数次,都可以清零
#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int singleNumber(vector<int>& nums)
{
int x = 0;
for (int i : nums)
{
x ^= i;
}
return x;
int main()
{
int num;
vector<int> v;
while (cin >> num)
{
v.push_back(num);
if (cin.get() == '\n')
{
cout << singleNumber(v) << endl;
v.clear();
}
}
}
2. single number 2
题目描述:
given an array of integres, every elements appears three time except for one ,find that single one
Note: your algorithm should have a linear runtime complexity,could you implement it without using extra memory?
count[i]表示在第i位出现1的次数,如果count[i]是3的整数倍,则忽略,否则取出来组成答案
int singleNumber(vector<int>& nums)
{
const int w = sizeof(int) * 8; //一个整数的bit位
int count[w]; //在i位出现的1的次数
fill_n(&count[0],w,0);
for (int i = 0; i < nums.size(); i++)
{
for (int j = 0; j < w; j++)
{
count[j] += (nums[i] >> j) & 1;
count[j] %= 3;
}
}
int result = 0;
for (int i = 0; i < w; i++)
{
result += (count[i] << i);
}
return result;
}
3. Candy
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int candy(const vector<int>& ratings)
{
vector<int> f(ratings.size());
int sum = 0;
for (int i = 0; i < ratings.size(); i++)
{
sum += solve(ratings, f, i);
}
return sum;
}
int solve(const vector<int>& ratings, vector<int>& f, int i)
{
if (f[i] == 0)
{
f[i] = 1; //跟它的邻居作比较
if (i > 0 && ratings[i] > ratings[i - 1])
f[i] = max(f[i], solve(ratings, f, i - 1) + 1);
if (i<ratings.size() - 1 && ratings[i] >ratings[i + 1])
f[i] = max(f[i], solve(ratings, f, i + 1) + 1);
}
return f[i];
}
4. Gas station
int canCompleteCircuit(vector<int>& gas, vector<int> &cost)
{
//设置两个变量
int total = 0;
int j = -1;
for (int i = 0, sum = 0; i < gas.size(); i++)
{
sum += gas[i] - cost[i]; //判断当前指针的有效性
total += gas[i] - cost[i]; //判断整个数组是否有解
if (sum < 0)
{
j = i;
sum = 0;
}
}
return total >= 0 ? j + 1 : -1;
}
5. set matrix zeros
o(mn)—o(m+n)—常数空间
//如果某一行或者某一列为0.将整行或者整列都置0
//空间复杂度为o(1)
void setZeroes(vector<vector<int>>& matrix)
{
const int m = matrix.size();
const int n = matrix[0].size();
bool row_zero = false;
bool col_zero = false;//第一列是否存在0
//第一行和第一列标记是否有0
for (int i = 0; i < n; i++)
{
if (matrix[0][i] == 0)
{
row_zero = true;
break;
}
}
for (int i = 0; i < m; i++)
{
if (matrix[i][0] == 0)
{
col_zero = true;
break;
}
}
//复用第一行第一列
for (int i = 1; i < m; i++)
{
for (int j = 1; j < n; j++)
{
if (matrix[i][j] == 0)
{
//借助第i行和第j列标记第一行和第一列
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
//利用第一行和第一列对第i行和第j列进行标记
for (int i = 1; i < m; i++)
{
for (int j = 1; j < n; j++)
{
if (matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
}
}
if (row_zero)
for (int i = 0; i < n; i++)
matrix[0][i] = 0;
if (col_zero)
for (int i = 0; i < m; i++)
matrix[i][0] = 0;
}
- Gray Code
- climbing stairs
- Plus one
高精度加法 - Rotate Image