- 領域
斐波那契(跳臺階之類)、數組數據排列、數組內部數據處理、圖像旋轉、鏈表等。
- 應用
借鑑學習總結
- 代碼
/*
* main.cpp
* TestAlgorithm
* Copyright © 2020 yancey. All rights reserved.
*/
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main(int argc, const char * argv[]) {
//
int numberWay(int n);
int n = 10;
int number = numberWay(n);
cout<<"value:"<<number<<endl;
//
vector<int> twoSum(vector<int>&nums, int target);
vector<int> nums = {1,3,5,8,11,13,15,18};
int target = 23;
vector<int> value = twoSum(nums,target);
for(vector<int>::iterator it = value.begin(); it != value.end(); it++){
cout<<"value:"<<*it<<endl;
}
//
void rotate (int* martrix, int n);
void rotate2 (int martrix[][4], int n);
int a[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int b[4][4] = {10,9,8,7,6,5,4,3,2,1,0,1,2,3,4,5};
rotate(*a,4);
rotate2(b, 4);
for(int i = 0; i < 4; ++i){
for(int j = 0; j < 4; ++j){
cout <<"a[i][j]:"<<a[i][j]<<endl;
cout <<"b[i][j]:"<<b[i][j]<<endl;
}
}
//
int removeDuplicates(vector<int>&nums);
vector<int> x = { 1, 1, 2};
vector<int> y = { 0,0,1,1,1,2,2,3,3,4 };
cout<<"len:"<<removeDuplicates(x)<<endl;
for(vector<int>::iterator it = x.begin(); it != x.end(); it++){
cout<<"x[i]"<<*it<<endl;
}
cout<<"len2:"<<removeDuplicates(y)<<endl;
for(vector<int>::iterator it = y.begin(); it != y.end(); it++){
cout<<"y[i]"<<*it<<endl;
}
//
void bubbleSort(int nums[], int n);
int nu[7] = {3,5,7,4,1,4,10};
bubbleSort(nu,7);
for(int i = 0; i < 7; i++){
cout<<"nu[i]"<<nu[i]<<endl;
}
return 0;
}
/*
*屬性:斐波那契
*問題描述:一隻青蛙一次可以跳上1級臺階,也可以跳上2級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法?
*解法:動態規劃
*/
int numberWay(int n)
{
if(n==0 || n==1){
return 1;
}
int a = 1;
int b = 1;
int res = 0;
for(int i = 2; i <= n; i++){
res = (a+b)%1000000007;
a = b;
b = res;
}
return res;
}
/*
*屬性:數組運算
*問題描述:給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。
*解法:hash
*/
vector<int> twoSum(vector<int>&nums, int target)
{
vector<int> vec;
map<int, int> dic;
for(int i=0;i<nums.size();++i){
dic[nums[i]] = i;
}
for(int i=0;i<nums.size();++i){
if(dic.count(target-nums[i])!=0 && dic[target-nums[i]] != i){
vec.push_back(i);
vec.push_back(dic[target-nums[i]]);
break;
}
}
return vec;
}
/*
*屬性:數組運算、指針數組、數組指針
*問題描述:圖像旋轉順時針90度。
*解法:
*/
void rotate (int* martrix, int n)
{
for(int layer = 0; layer < n/2; ++layer){
int first = layer;
int last = n-1-layer;
for(int i = first; i<last; ++i){
int offset = i - first;
int top = *(martrix + first*n + i);
//左->上
*(martrix + first*n + i) = *(martrix + (last-offset)*n + first);
//下->左
*(martrix + (last-offset)*n + first) = *(martrix + last*n + (last-offset));
//右->下
*(martrix + last*n + (last-offset)) = *(martrix + i*n + last);
//上->右
*(martrix + i*n + last) = top;
}
}
}
void rotate2 (int martrix[][4], int n)
{
for(int i = 0; i < (n+1)/2; i++){
for(int j = 0; j < n/2; j++){
/*
4->3
| |
2<-1
*/
int temp = martrix[n-1-j][i];
//右下->左下
martrix[n-1-j][i] = martrix[n-1-i][n-1-j];
//右上->右下
martrix[n-1-i][n-1-j] = martrix[j][n-1-i];
//左上->右上
martrix[j][n-1-i] = martrix[i][j];
//左下->左上
martrix[i][j] = temp;
}
}
}
/*
*問題屬性:數組運算
*問題描述:給定一個排序數組,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度.
*/
int removeDuplicates(vector<int>&nums)
{
int len = 0 ;
if(nums.size() == 0){
return 0;
}
else{
for(int i = 1; i < nums.size(); i++){
if(nums[len] != nums[i]){
nums[++len] = nums[i];
}
}
return len+1;
}
}
/*
*問題屬性:排列、冒泡、快速、插入、選擇
*問題描述:給定亂序數組,進行升序排列
*/
void bubbleSort(int nums[], int n)
{
for(int i = 0; i < n; i++){
for(int j = 0; j < n-i-1; j++){
if(nums[j] > nums[j+1]){
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
}
/*
*
*
*/