LeetCode weekly contest 278 (amazon pay)

------------恢复内容开始------------
第一题

简单的二分查找

class Solution {
public:
    int findFinalValue(vector<int>& nums, int original) {
        
        sort(nums.begin(), nums.end());
        
        while(find(original, nums) != nums.size())
        {
            original *= 2;
        }
        
        return original;
        
    }
    
    int find(int x, vector<int>& nums)
    {
        int l = 0;
        int r = nums.size()-1;
        while(l<=r)
        {
            int mid = (l+r)/2;
            if(nums[mid]<x)
            {
                l = mid+1;
            }
            else if(nums[mid]>x)
            {
                r = mid-1;
            }
            else
            {
                return mid;
            }
        }
        
        return nums.size();
    }
};

第二题

前缀和

class Solution {
public:
    int sum0[100005];
    int sum1[100005];
    int n;
    vector<int> maxScoreIndices(vector<int>& nums) {
        n = nums.size();
        if(nums[0]==0)
        {
            sum0[0]=1;
        }
        else
        {
            sum1[0]=1;
        }
        for(int i=1;i<n;i++)
        {
            if(nums[i]==0)
            {
                sum0[i]=sum0[i-1]+1;
                sum1[i]=sum1[i-1];
            }
            else
            {
                sum1[i]=sum1[i-1]+1;
                sum0[i]=sum0[i-1];
            }
        }
        
        int ans = max(sum1[n-1], sum0[n-1]);
        for(int i=1;i<n;i++)
        {
            ans = max(ans, sum0[i-1]+sum1[n-1]-sum1[i-1]);
        }
        
        vector<int> res;
        if(sum1[n-1]==ans)
        {
            res.push_back(0);
        }
        
        if(sum0[n-1]==ans)
        {
            res.push_back(n);
        }
        
        for(int i=1;i<n;i++)
        {
            if(ans==sum0[i-1]+sum1[n-1]-sum1[i-1])
            {
                res.push_back(i);
            }
        }
        
        return res;
        
    }
};

第三题
O(n)的计算hash值。利用取模运算法则,从后往前先计算k个字符的hash 值, 然后开始向左移动,每次移动都要先减去右边最后一个值,然后再乘以P,最后加上左边的

class Solution {
public:
    long long int num[20005];
    long long int num2[20005];
    int n;
    string subStrHash(string s, int power, int modulo, int k, int hashValue) {
        
        n = s.length();
        for(int i=0;i<n;i++)
        {
            num[i]=(s[i]-'a'+1);
        }
        
        long long int ans=0;
        string res;
        
        num2[0]=1;
        for(int i=1;i<k;i++)
        {
            num2[i] = ((power % modulo) * (num2[i-1] %modulo)) %modulo;
        }
        
        
        for(int i=n-1;i>= n-k;i--)
        {
            res += s[i];
            ans += (num[i] * num2[k + i - n])%modulo;
            ans %= modulo;
        }
        
        int pos;
        if(ans == hashValue)
        {
            pos = n-k;
        }
        
        for(int i=n-k-1;i>=0;i--)
        {
            //ans = abs(ans - ((num[i+k] * num2[k-1])%modulo));
            ans -= (num[i+k] * num2[k-1])%modulo;
            
            ans+= 2*modulo;
            ans %= modulo;
            
            ans *= (power % modulo);
            ans %= modulo;
            
            ans += num[i];
            ans %= modulo;
            
            if(ans == hashValue)
            {
                pos = i;
                continue;
            }
        }
        
        res="";
        for(int i=pos;i<pos+k;i++)
        {
            res+=s[i];
        }
        
        return res;
    }
};

第四题

并查集,然后加上位运算异或,直接把两个word做异或运算,会超时。用二叉树来做异或就可以了

class Solution {
public:
  int num[20005];
int f[20005];
map<int, int> m;
struct Node
{
   Node* left;
   Node* right;
   int number;
   int tag;
   Node(int number)
   {
       this->left = NULL;
       this->right = NULL;
   	this->number = number;
   }
};

vector<int> groupStrings(vector<string>& words) {

   for (int i = 0; i < words.size(); i++)
   {
   	int x = 0;
   	for (int j = 0; j < words[i].length(); j++)
   	{
   		x |= 1 << (words[i][j] - 'a');
   	}

   	num[i] = x;
   	f[i] = i;
   }

   Node* root = new Node(0);
   root->number++;

   fun(root, num[0], 1, 0);
   for (int i = 1; i < words.size(); i++)
   {
   	fun2(root, num[i], 1, 0, 0, i);
   	root->number++;
   	fun(root, num[i], 1, i);
   }

   int ans = 0;
   int res = 0;
   for (int i = 0; i < words.size(); i++)
   {
   	int fx = find(i);
   	if (m[fx] == 0)
   	{
   		ans++;
   	}

   	m[fx]++;

   	res = max(res, m[fx]);
   }

   vector<int> result;
   result.push_back(ans);
   result.push_back(res);

   return result;
}

void fun(Node* root, int x, int pos, int tag)
{
   if (pos == 27)
   {
   	root->tag = tag;
       return;
   }

   int y = x & 1;
   if (y == 1)
   {
   	if (root->left == NULL)
   	{
   		root->left = new Node(0);
   	}

   	root->left->number++;

   	fun(root->left, x >> 1, pos + 1, tag);
   }
   else
   {
   	if (root->right == NULL)
   	{
   		root->right = new Node(0);
   	}

   	root->right->number++;

   	fun(root->right, x >> 1, pos + 1, tag);
   }
}

void fun2(Node* root, int x, int pos, int diff1, int diff2, int tag)
{
   if (diff1 >= 2 || diff2 >= 2)
   {
   	return;
   }

   if (pos == 27)
   {
   	int fa = find(root->tag);
   	int fb = find(tag);

   	f[fb] = fa;
   	return;
   }

   int y = x & 1;
   if (y == 1)
   {
   	if (root->left != NULL)
   	{
   		fun2(root->left, x >> 1, pos + 1, diff1, diff2, tag);
   	}

   	if (root->right != NULL)
   	{
   		fun2(root->right, x >> 1, pos + 1, diff1 + 1, diff2, tag);
   	}
   }
   else
   {
   	if (root->left != NULL)
   	{
   		fun2(root->left, x >> 1, pos + 1, diff1, diff2 + 1, tag);
   	}

   	if (root->right != NULL)
   	{
   		fun2(root->right, x >> 1, pos + 1, diff1, diff2, tag);
   	}
   }

}

int find(int x)
{
   if (f[x] != x)
   	f[x] = find(f[x]);

   return f[x];
}

};
posted @ 2022-02-11 00:01  Shendu.CC  阅读(49)  评论(1编辑  收藏  举报