求两个数组的交集+最长公共前缀

求两个数组的交集-lc350

解:两个指针比较是否相等即可

class Solution {
public:
   vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
  {
       map<int,int> mp;
       vector<int> ans;
       for(auto i:nums1)
         mp[i]+=1;
 
       for(auto j:nums2)
      {
           if(mp[j]>0){
           mp[j]-=1;
           ans.push_back(j);
          }
      }
      return ans;
  }
};

如果给定数组已经排好序,优化版;

1,设定两个指针,比较两个指针指向元素,相同元素放进空白数组

2;不同元素,将指针指向小的元素后移

3,重复以上步骤,知道任意一个数组终止

class Solution {
public:
   vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
  {
    int i=0,j=0,k;
    sort(nums1.begin(),nums1.end());
    sort(nums2.begin(),nums2.end());
    vector<int> ans;
    while(i<nums1.size() && j<nums2.size() )
    {
        if(nums1[i]>nums2[j])
         j++;
        else if(nums1[i]<nums2[j])
          i++;
        else
        {
            ans.push_back(nums2[j]);
            i++;
            j++;
        }
    }
    return ans;
  }
};

...一定要初始化......

遍历过后的数组没用,可以用来储存答案,节省内存和空间;

第二种比第一种内存小;

 

最长公共前缀-lc14

找字符串数组中的最长公共前缀;

解:将第一个元素作为基准元素,依次将基准元素与后边的每个元素相比较,不断更新基准元素,直到基准元素和所有元素都满足公共前缀

如果基准元素和任意一个元素无法匹配,不存在公共前缀,直接退出。

特判一下数组为空的情况。

compare(X0,x);(X0为基准元素,x为比较元素);

如果conpare(x0,x)==0,截取掉x0的最后一个元素,依次比较直到得出结果

比如flight和flow

flight ----flow 去掉t,h,g,i之后,前缀为fl

代码:

class Solution {
   public String longestCommonPrefix(String[] strs) {
       if(strs.length<1)
        return "";
       int idx=0;
       for(int i=0; i<strs[0].length(); i++)
      {
           char cur=strs[0].charAt(i);//charAt返回指定索引时的值

           for(String str :strs)
          {
               if(str.length()==i||cur!=str.charAt(i))
                return str.substring(0,idx);
          }
           idx++;
      }
       return strs[0].substring(0,idx);

  }
}
class Solution{
public String longestCommonPrefix(String[] strs) {
       if (strs.length == 0) return "";
       String prefix = strs[0];
       for (int i = 1; i < strs.length; i++)
           while (strs[i].indexOf(prefix) != 0)
          {//Java的indexof函数直接在一个字符串中找另一个字符串
               prefix = prefix.substring(0, prefix.length() - 1);
               if (prefix.isEmpty()) return "";
          }        
       return prefix;

  }
}

第二中用时较短,内存消耗和第一种相同;分治应该也可以吧....

原文地址:https://www.cnblogs.com/sweetlittlebaby/p/13414234.html