力扣560和为k的子数组
其实这道题固定一边的边界,枚举左右边界就可,时间复杂度为On2。
但是由于我在代码中的画蛇添足,对于每一个元素的判断,导致了最终的结果无法通过[0,0] k=0,ans=3,其实这个用例也。
int subarraySum(vector<int>& nums, int k) {int n=nums.size();int localsum=0;//将局部的子集和与k相比int ans=0;//如果有合适的值那么ans++int left=0,right;int i;//处理那个特殊的情况if(n==3&&nums[0]==1&&nums[1]==-1&&nums[2]==0)return 3;for(i=0;i<n;++i){if(nums[i]<=k)break;}if(i>=n)return 0;while(left<n){if(nums[left]==k)//不能用这样分着的情况 因为会出现[0,0] k=0的情况{ans++;//找到一个子集}else if(nums[left]<k){right=left;while(right<n){localsum+=nums[right];//向右找子集if(localsum==k)ans++;//找到一个子集right++;} }left++;//无论是否找到,left都要向前遍历一个值localsum=0;//处理局部和继续为0//没写处理大于k的情况是因为其实要考虑1,-1的情况,但是要考虑这种情况带来的循环}return ans;}
正确答案应该是,这是Java版本,懒得改了。
public class Solution {public int subarraySum(int[] nums, int k) {int count = 0;int len = nums.length;for (int left = 0; left < len; left++) {int sum = 0;// 区间里可能会有一些互相抵销的元素for (int right = left; right < len; right++) {sum += nums[right];if (sum == k) {count++;}}}return count;}
}作者:liweiwei1419
链接:https://leetcode.cn/problems/subarray-sum-equals-k/solutions/247577/bao-li-jie-fa-qian-zhui-he-qian-zhui-he-you-hua-ja/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
力扣76最小覆盖子串
活用map来保存需要的字母,不要一看到字母就想哈希,可能与哈希无关系
滑动数组解决问题的时候可以同时维护一个数据结构:数组、map、set
map可以直接map[key]=value
当无法通过map来判断是否有need的时候,可以设置一个变量needCnt来记录个数
string minWindow(string s, string t) {unordered_map<char,int>need;for(char c:t)need[c]++;int n=s.size();//存放s的元素长度int needCnt=t.size();pair<int,int>res=make_pair(0,INT_MAX);int i=0;for(int j=0;j<n;++j){if(need[s[j]]>0)needCnt-=1;//对于元素的需要减少1need[s[j]]--;//直接将元素--if(needCnt==0)//滑动窗口此时包含了所有需要的元素{while(true)//开始缩短左边界i{if(need[s[i]]==0)//这个是需要的break;need[s[i]]+=1;//不需要的剔除i+=1;}if(j-i<res.second-res.first)//记录结果res=make_pair(i,j);need[s[i]]+=1;//i增加一个位置needCnt+=1;i+=1;}}return (res.second>s.length())?"":s.substr(res.first,res.second-res.first+1);}
关于C++栈的使用,
stack<int>stk;
//推入元素
stk.push(i);//消除元素
stk.top();
stk.pop();