classSolution{public:boolcanPartition(vector<int>& nums){if(nums.size()<=1)returnfalse;int sum =0, i, j;for(i =0; i < nums.size();++i)sum += nums[i];if(sum&1)returnfalse;//奇數(shù)不可分//dp求解,每個元素拿或者不拿,求解所有的狀態(tài)set<int> state;state.insert(0);//初始化state.insert(nums[0]);for(i =1; i < nums.size();++i){for(auto it = state.rbegin(); it != state.rend();++it){//用set,不能用哈希set,且必須逆序遍歷,新插入的不會被本次遍歷到state.insert(*it+nums[i]);}if(state.count(sum>>1))returntrue;}returnfalse;}};
936 ms 16.3 MB
采用數(shù)組實現(xiàn)dp
classSolution{public:boolcanPartition(vector<int>& nums){if(nums.size()<=1)returnfalse;int sum =0, i, j;for(i =0; i < nums.size();++i)sum += nums[i];if(sum&1)returnfalse;//奇數(shù)不可分//dp求解,每個元素拿或者不拿,求解所有的狀態(tài)vector<bool>state(sum+1,false);state[0]=true;//初始化state[nums[0]]=true;for(i =1; i < nums.size();++i){for(j = sum; j >=0;--j){if(state[j])state[j+nums[i]]=true;}if(state[sum>>1])returntrue;}returnfalse;}};
312 ms 8.9 MB
再優(yōu)化下存儲空間,只查找到 sum/2 的狀態(tài),超過的忽略
以下代碼有bug [99,1] 這個例子,第一個數(shù)會越界
classSolution{public:boolcanPartition(vector<int>& nums){if(nums.size()<=1)returnfalse;int sum =0, i, j;for(i =0; i < nums.size();++i)sum += nums[i];if(sum&1)returnfalse;//奇數(shù)不可分//dp求解,每個元素拿或者不拿,求解所有的狀態(tài)sum >>=1;vector<bool>state(sum+1,false);state[0]=true;//初始化state[nums[0]]=true;for(i =1; i < nums.size();++i){for(j = sum; j >=0;--j){if(state[j]&& j+nums[i]<= sum)state[j+nums[i]]=true;}if(state[sum])returntrue;}returnfalse;}};