3702
首先应当寻找最大元素,因为最大元素转为二进制与其它数异或后,其最高位最可能不变
然后考虑最大元素为奇数还是偶数
如果是偶数,那么只要不是异或自身,则与其它数的异或结果一定不是0,因为有自己的最高位
如果为奇数,那么应该跳过小于它的紧邻偶数
不过这考虑的是第一个数,即如果已经有一个安全偶数,则后续奇数和其紧邻偶数可一起出现
所以应当先排序,然后寻找第一个安全偶数
找到后再接上剩余数组的数量即可
先判断第一个数是否为偶数,如果是,则res=size
如果为奇数,看其紧邻的下一个数是奇数还是偶数
如果是奇数,则res+=1
如果为偶数,检测是否为紧邻的,如果是,则res=size-1
否则,res=size-1
或许不是偶数的问题,而是最高位的1什么时候确定的问题,最高位的1一旦确定,那么剩下的都可以随便选
如果第一个数是偶数,那么res=size
如果是奇数,看下一个是否为紧邻偶数,如果是,那就只能二选一,为size-1
否则,也是res=size
还要考虑去重的问题,有重复元素
也就还是只考虑最大元素的重复问题
如果最大元素重复奇数次,那不影响
如果重复偶数次,则需要再去掉一个
应当先完成最大元素的去重,再判断紧邻元素
对于奇数的紧邻偶数,应该也要考虑偶数的重复情况,即如果它重复奇数次,则正常减1,否则不用减
存在问题,就是4和5
4是100,5是101
奇数后面是其紧邻偶数,不一定结果就是0,只是其最高位为0
那要这要考虑,问题就复杂了,不过结果只是这个1该不该减的问题
class Solution { public: int longestSubsequence(vector<int>& nums) { if(nums.size()==1){ return 1; } sort(nums.begin(),nums.end()); int res=nums.size(),beg=nums.size()-1; while(beg>0&&(nums[beg]==nums[beg-1])){ beg--; } if((nums.size()-beg)%2==0){ res--; } if(beg==0){return res;} if(nums[beg]%2){ if((nums[beg]-nums[beg-1])==1){ int beg2=beg-1; while(beg2>0&&(nums[beg2]==nums[beg2-1])){ beg2--; } if((beg-beg2)%2){ res--; } } } return res; // if(nums[nums.size()-1]%2){ // if((nums[nums.size()-1]-nums[nums.size()-2])==1){ // return nums.size()-1; // }else{ // return nums.size(); // } // }else{ // return nums.size(); // } //return nums[nums.size()-1]-nums[nums.size()-2]==1? } };