1. 程式人生 > 實用技巧 >求兩個陣列的交集+最長公共字首

求兩個陣列的交集+最長公共字首

求兩個陣列的交集-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;

}
}

第二中用時較短,記憶體消耗和第一種相同;分治應該也可以吧....