学習経験--Leetcode所与AddressSanitizer:アドレス0x60200000002cにヒープバッファオーバーフロー(コード4とleetcodeタイトルアルゴリズム)

学習経験:

ブラシは遅いが、私は最近、ブラシleetcodeにされているが、本当に多くのことを学ぶこと。前の学習経験は、私が前の話メモリオーバーフローの場合には登場してきたが、解決することができませんでした。第四の質問にブラシでは:2つの配列の中央値を検索し、私は再び同じ問題に遭遇しました。しかし、この時間は、私は最終的に理由を見つけることができました。最初は間違ったヒントを掲載:
ここに画像を挿入説明
ここに画像を挿入説明
不正なメモリアクセスAddressSanitizerチェックのLeetCodeの使用がある場合、それの問題は、我々が交差するラインの配列にアクセスすることです。これは本当に頭痛の種です。
インターネットは多くの時間を検索し、私はこの記事で、以下のいくつかのインスピレーションを得ました。記事は、操作は、配列のプラスまたはマイナス境界の割り当てにつながる可能性があるという。人気のは、しばしば間違いはI ++、および他の自動インクリメント動作またはアクセス次の配列要素は、また、クロスボーダー配列を生じる、マルチアクセス動作のサイクルの最後であってもよいこれらの操作の順序を逆にしてもよいということです。
https://blog.csdn.net/huihui_8/article/details/100052677

その理由について知った後、私は、クロスボーダーの状況を回避するために、コード内でリガ、いくつかの文を判断します。最後に、本当に単純に合格しました。コードを接続します。

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int size_left = (nums1Size + nums2Size + 1)/2;
    int i = 0, j = size_left-i;
    double max_left,min_right;
    if(nums1Size > nums2Size){
        int *temp,t;
        temp = nums1;
        nums1 = nums2;
        nums2 = temp;
        t = nums1Size;
        nums1Size = nums2Size;
        nums2Size = t;
    }
    if(nums1Size==0 && nums2Size==0)
        return 0;
    else if(nums1Size==0){
        max_left = nums2[(nums2Size-1)/2];
        min_right = nums2[nums2Size/2];
    } 
    else{
        while(i<=nums1Size){
            if(i == nums1Size){
                if(j==0)
                    max_left = nums1[i-1]; 
                else
                    max_left = nums1[i-1]>nums2[j-1]?nums1[i-1]:nums2[j-1];
                min_right = nums2[j];
                break;
            }
            else if(nums1[i]>=nums2[j-1]){
                if(i==0){
                    if(j==nums2Size)
                        min_right = nums1[i];
                    else
                        min_right = nums1[i]<nums2[j]?nums1[i]:nums2[j];
                    max_left = nums2[j-1];
                    break;
                }
                max_left = nums1[i-1]>nums2[j-1]?nums1[i-1]:nums2[j-1];
                min_right = nums1[i]<nums2[j]?nums1[i]:nums2[j];
                break;

            }
            else{   
                i++;
                j = size_left-i;
            }    
        }
    }
    if((nums1Size + nums2Size)%2 == 0)
        return (max_left+min_right)/2;
    else
        return max_left;

}

ここに画像を挿入説明

リリース6元記事 ウォンの賞賛0 ビュー136

おすすめ

転載: blog.csdn.net/weixin_38072112/article/details/103972360