算法
xiaowhy
这个作者很懒,什么都没留下…
展开
-
数组中连续子数组最大和
使用动态规划解法:#include <stdio.h>#include <stdlib.h>int MaxSum(int *nums, int len){ int sum = nums[0]; int n = nums[0]; for(int i=1; i < len; i++) { if(n > 0) n+= nums[i]; el...原创 2021-11-10 17:00:00 · 235 阅读 · 0 评论 -
全排列2,去重复
void dfs(vector<int>& nums, int n, int i, list<int>& cur, list<list<int> >& ret, vector<bool> &flag){ if(i == n) { ret.push_back(cur); return; } ...原创 2021-10-06 13:46:00 · 161 阅读 · 0 评论 -
数组的全排列
void dfs(int* nums, int n, int i, list<int>& cur, list<list<int> >& ret, vector<bool> &flag){ if(i == n) { ret.push_back(cur); return; } for(int p = 0; p ...原创 2021-10-06 11:01:48 · 168 阅读 · 0 评论 -
两个数字字符串相乘
使用性质:长为n的数和长为m的数相乘的结果最大长度为m+n; 结果存在数组res中,num1[i]*num2[j]的结果为两位数tmp(0x或者xy),其中第一位位于 res[i+j], 第二位位于res[i+j+1]。 代码: string multiply(string& num1, string& num2) { vector<int> arr1; vector<int> a...原创 2021-09-11 09:05:32 · 435 阅读 · 0 评论 -
查找缺少的第一个正数
要求算法O(n),只能使用常数级别的额外空间int firstMissNum(int *nums, int len){ for(int i=0; i < len; ) { if(nums[i] >0 && nums[i] < len && nums[i] != nums[nums[i]-1]) { int in...原创 2021-09-10 16:09:11 · 110 阅读 · 0 评论 -
数组中和等于指定值,不可重复使用
数组中可能会有重复值在上个版本中做优化,去掉重复值,不重复利用void backtrack(vector<int> &candidates, int target, list<vector<int> >&res, int i, vector<int> &tmp_list);void comSum(vector<int>& candidates, int target){ list<...原创 2021-09-08 11:12:33 · 280 阅读 · 0 评论 -
数组中元素组合等于某个值和,可重复使用
利用回朔法,递归,当某个值超出时,移除,再遍历下个值void backtrack(vector<int> &candidates, int target, list<vector<int> >&res, int i, vector<int> &tmp_list);void comSum(vector<int>& candidates, int target){ list<vector...原创 2021-09-07 17:12:09 · 347 阅读 · 0 评论 -
查找排序数组插入一个值的指定位置
void searchRange(int *arr, int len, int target){ if(len == 0) return; int left = 0; int right = len -1; int ans = len; while(left <= right) { int mid = ((right - left) >> 1) + left...原创 2021-09-02 16:51:42 · 107 阅读 · 0 评论 -
查找排序数组指定值范围
查找排序数组指定值,会有重复值,找出第一个和最后一个值的位置void searchRange(int *arr, int len, int target){ if(len == 0) return; int left = 0; int right = len -1; while(left <= right) { int mid = (left + right) >> ...原创 2021-09-02 16:27:54 · 172 阅读 · 0 评论 -
搜索旋转排序数组
在一个旋转排序数组中查找指定值比如4,5,6,7,0,1,2 中搜索0int Search(int *arr, int len, int target){ int l = 0; int r = len; if(r == 0) return -1; int m; while(r > l) { m = (l+r) >> 1; ...原创 2021-08-30 19:23:13 · 105 阅读 · 0 评论 -
最长有效括号长度
int FindMaxStr(const char* s, int len){ int *f = new int[len]; for(int i=0; i < len; ++i) { f[i] = 0; } int i, t, ret = 0; for(i = 1; i < len; ++i) { if(s[i] == ...原创 2021-08-26 11:02:56 · 112 阅读 · 0 评论 -
获取下一个较小数组
void swap(int i, int j, int *nums){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp;}void reverse(int *nums, int len , int index){ int i = index; int j = len -1; while(i < j) { ...原创 2021-08-23 10:45:40 · 118 阅读 · 0 评论 -
一个字符串,查找字符串列表中,合并后的字串位置
一个字符串,查找字符串列表中,合并后的字串位置1:遍历方法2.优化后的遍历void findSubString(string &s, string* words, int len){ if(len == 0) { return; } int n = s.length(); int word_cnt = len; int m = words[0].length...原创 2021-08-21 15:37:37 · 153 阅读 · 0 评论 -
实现strstr
int StrStr(string & src, string &dest){ if(src.length() < dest.length()) return -1; for(int i=0; i < src.length() - dest.length(); ++i) { const char* p = src.c_str() + i; ...原创 2021-08-20 14:28:47 · 89 阅读 · 0 评论 -
删除数组指定值
不借助第三方内存,O(1)int DelValNums(int *arr, int len, int val){ if(len == 0) return 0; int i = 0; for(int j=0; j < len; ++j) { if(arr[j] != val) { arr[i] = arr[j]; ...原创 2021-08-20 14:15:00 · 187 阅读 · 0 评论 -
删除排序数组中重复的数字
不借助第三方内存,O(1)时间复杂度using namespace std;int DelDupNums(int *arr, int len){ if(len == 0) return 0; int i = 0; for(int j=1; j < len; ++j) { if(arr[j] != arr[i]) { ...原创 2021-08-20 14:08:38 · 72 阅读 · 0 评论 -
N个一组反转链表
struct Node{ int value; Node* next;};Node* reverse(Node* head, Node* tail){ if(head == NULL || head->next == NULL) return head; Node* pre = NULL; Node* next = NULL; while(pre != tai...原创 2021-08-20 13:57:32 · 326 阅读 · 0 评论 -
单个链表反转
struct Node{ int value; Node* next;};Node* reverse(Node* head, Node* tail){ if(head == NULL || head->next == NULL) return head; Node* pre = NULL; Node* next = NULL; while(pre != tai...原创 2021-08-18 19:18:56 · 78 阅读 · 0 评论 -
链表两两交换节点
用的递归的方法struct Node{ int value; Node* next;}Node* SwapPairs(Node* head){ if(head == NULL || head->next == NULL) return head; Node* first = head; Node* second = head->next; first-...原创 2021-08-16 16:09:11 · 93 阅读 · 0 评论 -
合并N个有序链表
有几种方法,目前只写了每两两合并struct Node{ int value; Node* next;}Node* MergeNode(Node* l1, Node* l2){ Node* temp = new Node(); Node* head = temp; while(l1 && l2) { if(l1.value < l2.valu...原创 2021-08-16 09:16:43 · 431 阅读 · 0 评论 -
合并排序链表
struct Node{ int value; Node* next;}Node* MergeNode(Node* l1, Node* l2){ Node* temp = new Node(); Node* head = temp; while(l1 && l2) { if(l1.value < l2.value) ...原创 2021-08-14 13:22:13 · 99 阅读 · 0 评论 -
删除链表倒数N个节点
struct Node{ int value; Node* next;}Node* DelNodeN(Node* head, int n){ Node* head2 = head; while(n>0 ) { head2 = head2->next; if(head2 == NULL) { ...原创 2021-08-14 11:22:11 · 67 阅读 · 0 评论 -
最接近值三数之和
int FindMinSum(vector<int> &arr, int len, int target){ std::sort(arr.begin(), arr.end()); int ans = 0; if(arr.size() <=3) { for(int i=0; i < arr.size(); ++i) { ...原创 2021-08-14 10:43:47 · 68 阅读 · 0 评论 -
三数之和等于指定值
struct _Two{ int i; int j;};struct _Three: public _Two{ int k;};void TwoSum(int *arr, int start, int end, int firstvalue, int target, vector<_Three> &result){ map<int, int> testMap; for(int i=start;...原创 2021-08-14 10:15:04 · 236 阅读 · 0 评论 -
求最大水容器
给定n个非负整数,表示水库隔板的高度,选出两个,求最大的容器面积两个指针,从两头往中间移动,每次移动较小的数值,求最大的积int FindMaxWater(int *IA, int len){ int i=0,j=len-1; int ret = 0; while(i < j) { ret = max(ret, (j-i) * min(IA[i], IA[j])); ...原创 2021-08-13 13:15:54 · 135 阅读 · 0 评论 -
string转int
自己大致实现的,有点粗糙int Atoi(const string& str){ int ret = 0; bool bFirst = false; bool bMinus = false; for(int i=0; i < str.length(); ++i) { if(str[i] == ' ') continue; if(str[i] ...原创 2021-08-12 16:01:23 · 538 阅读 · 0 评论 -
int数字反转
例如 1234,反转后变成4321int ReverInt(int x){ bool bFlag = x<0?true:false; if(bFlag) x = -x; long long ret = 0; while(x>0) { int bit = x%10; ret = ret*10 + bit; x /...原创 2021-08-12 15:18:14 · 442 阅读 · 0 评论 -
每日一算法(查找字符串最大回文字符串)
查找一个字符串里的最大回文字符串1. 使用动态规划方法,把该字符串逆序,相当于查找正序和逆序两个字符串中的最大公共子字符串的长度void FindMaxMid(const string& S){ string _S; _S.resize(S.size()); for(int i=S.length()-1, j=0; i >=0; i--,j++) { _S[j] = S[i]; ...原创 2021-08-12 13:20:07 · 435 阅读 · 0 评论 -
每日一算法(查找两个数组的中位数)
数组是排序的,总大小知道,可以知道中位数的索引位置,使用两个指针,类似归并排序,到中间位置后停止void FindMid(int *arr1, int len1, int *arr2, int len2){ int p1 = 0; int p2 = 0; int total = len1+len2; int mid1 =0; if(total%2 == 1) { mid1 ...原创 2021-08-11 13:54:50 · 206 阅读 · 0 评论 -
每日一算法(查找字符串最大长度不重复子串)
//遍历 O(N2)int findMax(const string& strsrc){ int ret = 0; int cTemp[256] = {0}; for(int i=0; i < strsrc.length(); ++i) { int mid_ret = 0; memset(cTemp, 0, sizeof(cTemp)); ...原创 2021-08-10 13:36:11 · 160 阅读 · 0 评论 -
每日一算法:数组中查找两位数和为指定值
通过map,往前查找,有没有和当前值和为指定值的int main(){ int testarr[] = {1,2,3,4,5,6,7,8,9,10}; int target = 10; std::map<int, int> testMap; for(int i=0; i < 10; ++i) { int temp = target - testarr[i]; ...原创 2021-08-09 11:03:25 · 186 阅读 · 0 评论 -
每日一算法(链表计算和,超过进位)
类似加法计算,进位,用链表存储struct Node{ int value; Node* next; Node() { value = 0; next = NULL; } Node* AddNode(Node* curNode, int iv) { Node* node = new Node(...原创 2021-08-09 11:04:46 · 110 阅读 · 0 评论