91³Ô¹ÏÍø

Watch CBS News

Houston pulls off furious rally to down Duke in Final Four, will meet Florida in title game

Houston's suffocating defense wiped away a 14-point deficit over the final eight minutes and erased Cooper Flagg and Duke's title hopes Saturday in a 70-67 stunner over the Blue Devils at the Final Four.

Duke made a grand total of one field goal over the last 10 1/2 minutes of this game. The second-to-last attempt was a step-back jumper in the lane by Flagg that J'Wan Roberts disrupted. The last was a desperation heave by Tyrese Proctor that caught nothing at the buzzer.

Houston v Duke
J'Wan Roberts #13 and Mylik Wilson #8 of the Houston Cougars react during the second half in the Final Four game of the NCAA Men's Basketball Tournament against the Duke Blue Devils at the Alamodome on April 05, 2025 in San Antonio, Texas. Getty Images

It was Roberts' two free throws with 19.6 seconds left that gave the Cougars their first lead since 6-5. LJ Cryer, who led Houston with 26 points, made two more to push the lead to three. It was Houston's biggest lead of the night.

The Cougars, who never won a title, not even in the days of Phi Slama Jamma, will play Florida on Monday night for the championship.

Florida's 79-73 win over Auburn in the early game was a free-flowing hoopsfest. This one would've looked perfect on a cracked blacktop and a court with chain-link nets.

That's just how Houston likes it. It closed the game on an 11-1 run, and though Flagg finished with 27 points, he did it on 8-for-19 shooting and never got a good look after his 3 at the 3:02 mark put the Blue Devils up by nine.

It looked over at that point. Houston was just getting started.

A team that prides itself on getting three stops in a row — calling the third one the "kill stop" — allowed a measly three free throws down the stretch.

Houston finished with four blocked shots, including four from its eraser, Joseph Tugler.

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=50747257b890e014813016b79ece0fb2'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });