Leetcode个人训练答案-指针

  • 206反转链表
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        //递归
        /*ListNode* ans;
        if(head == nullptr) return head;
        if(head->next == nullptr) return head;
        ans = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return ans;*/
        //双指针
        ListNode* temp;
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while(cur != nullptr) {
            temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};

仔细琢磨一下递归,ans指向的值始终都是链表的尾结点。

  • 203移除链表元素
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(head == nullptr) return head;
        while(head->val == val) {
            if(head->next == nullptr)
                return nullptr;
            if(head->val == val)
                head = head->next;
        }
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while(cur != nullptr) {
            if(cur->val == val) {
                pre->next = cur->next;
                cur = cur->next;
            }
            else {
                pre = cur;
                cur = cur->next;
            }
        }
        return head;
        /*ListNode * pre = nullptr;
        ListNode * dummpy = head;
        while(dummpy){
            if(dummpy->val == val)
            {
                if(!pre){
                    head = dummpy->next;
                    dummpy = dummpy->next;
                }
                else{
                    pre->next = dummpy->next;
                    dummpy = dummpy->next;
                }
            }
            else{
                pre = dummpy;
                dummpy = dummpy->next;
            }
        }
        return head;*/
    }
};

注释掉的是灰的方法,我觉得写的很清晰~

  • LCP剧情触发事件
class Solution {
public:
    vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
        int raws = increase.size() + 1;
        int cols = increase[0].size();
        int an = requirements.size();
        vector<vector<int>> sum(raws,vector(cols,0));
        for(int i = 1;i < raws;++i) {
            for(int j = 0;j < cols;++j) {
                sum[i][j] = sum[i-1][j] + increase[i-1][j];
            }
        }
        vector<int> ans;
        for(auto v:requirements) {
            int l = 0;
            int r = increase.size();
            while(l < r) {
                int m = (l + r) / 2;
                if(sum[m][0] >= v[0] && sum[m][1] >= v[1] && sum[m][2] >= v[2])
                    r = m;
                else l = m + 1;
            }
            if(sum[r][0] >= v[0] && sum[r][1] >= v[1] && sum[r][2] >= v[2])
            ans.push_back(r);
            else ans.push_back(-1);
        }
        return ans;
        /*vector<int> ans(an,-1);
        int day = 0;
        int i = 0;
        int j = 0;
        for(day = 0;day < an;++day) {//i是行数
            for(i = 0;i < raws;++i) {//day是天数
                int flag = 0;
                for(j = 0;j < cols;++j) {//j是列数
                    if(requirements[day][j] > sum[i][j]) {
                        break;
                    }
                    else ++flag;
                }
                if(flag == cols && ans[day] == -1) {
                    ans[day] = i;
                    break;
                }
            }
        }
    }
};
/*class Solution {
public:
    int biFind(const vector<vector<int>>& increase,const vector<vector<int>>& requirements,int  RowNum, int  target)
    {
        if(target == 0 ) return 0;
        int high = increase.size()-1, low = 0;
        while (low <= high){
		    int mid = low + (high - low) / 2;
		    if (increase[mid][RowNum] >= target && increase[mid-1][RowNum] < target){
                return mid;
            }
            if(increase[mid][RowNum] >= target){
                high = mid;
            }
            else{
                low = mid+1;
            }
	    }
        return -1;
    }

    vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
        int resourceNum = increase.size();
        int requireNum = requirements.size();
        for(int i = 1; i<resourceNum; i++)
        {
            increase[i][0] += increase[i-1][0];
            increase[i][1] += increase[i-1][1];
            increase[i][2] += increase[i-1][2];
        }
        increase.insert(increase.begin(),vector<int>{0,0,0});
        vector<int> res(requireNum,-1);
        for(int i = 0 ; i < requireNum; i++){
            int index_0 = biFind(increase, requirements, 0, requirements[i][0]);
            int index_1 = biFind(increase, requirements, 1, requirements[i][1]);
            int index_2 = biFind(increase, requirements, 2, requirements[i][2]);
            if(index_0 <0 || index_1 <0 || index_2 < 0) continue;
            res[i] = max(index_0, max(index_1,index_2));
        }
        return res;

    }
};*/

题解的答案,我的答案和灰的答案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值